46
PHP Go VROOOM! How to take a site from slow to go

Php go vrooom!

Embed Size (px)

DESCRIPTION

Given at php tek 2011, a frontend to server setup tour of how to squeeze performance out of your PHP powered website.

Citation preview

Page 1: Php go vrooom!

PHP Go VROOOM!How to take a site from slow to go

Page 2: Php go vrooom!

Disclaimer

This talk is for beginners

This is not “how to profile PHP”

This is not “how to use HipHop”

This is not how to profile your network

Velma would be bored (you might be too)

I will no doubt rant

Page 3: Php go vrooom!

PHP is NOT your problem!**95.99% of the time

Page 4: Php go vrooom!

Why your app is slow…

Client Side

Server Side

IO

Database

Frameworks

Hardware

Let the Lecture Begin!

Page 5: Php go vrooom!

Client SideDo you want some Expires with that?

Page 6: Php go vrooom!

Profile – Don’t Guess!

http://developer.yahoo.com/yslow/

http://code.google.com/speed/page-speed/

http://tools.pingdom.com/

http://www.fiddler2.com/fiddler2/

Page 7: Php go vrooom!

CSS

Make it external One file – minimized and compressed

(minify) Put it at the top Use sprites for images Avoid expressions No @import Use conditional tags for IE issues, not css

hacks Specific Selectors Give images dimensions

Page 8: Php go vrooom!

Javascript

Make it external

One file – minimized and compressed (minify)

Put it at the bottom

Or defer the loading completely

Use a well maintained framework

document.write is a bad bad thing

Page 9: Php go vrooom!

Images

Use the right format – png, gif or jpg

Compress that image – lots of compression tools available

Keep them small

Scale them on the server, not with html size/width

Have a small, cacheable favicon.ico

Use sprites for layouts

Page 10: Php go vrooom!

Cookies (om nom nom)

Keep them small

Keep them very domain specific

Page 11: Php go vrooom!

HTTP Requests

Compress, compress, compress

Use a CDN and/or media server

Reduce DNS Lookups

No 404‟s, empty img/hrefs

Avoid redirects

Parallelize downloads

Watch external script use! (fb, google, social anything)

Page 12: Php go vrooom!

Client Side Caching

Use cache control headers!◦ Expires

◦ Last-Modified

◦ (best)

◦ Cache-Control

◦ Etag

◦ (harder to get right)

Be kind to proxies as well

Page 14: Php go vrooom!

Server SetupHave you hugged your sysadmin today?

Page 15: Php go vrooom!

Profile, Don’t Guess!

Apache Bench

Siege

Http_Load

JMeter

Page 16: Php go vrooom!

Upgrade your Software

Security

Speed

Some Pain (worth it)

Compile your own – it‟s faster then the distros!◦ Drop your debug data

◦ Tune to your architecture

◦ At the very least do PHP, Server, Database

Page 17: Php go vrooom!

Install APC (or something)

“memcache does precisely f**k all for opcode caching” – Michael Maclean

This is the #1 best way to speed up your PHP site

Page 18: Php go vrooom!

Don’t Use PHP and Use a CDN

Simple servers for static content

Cache full pages and bypass PHP

Dynamic images and CSS are a pain, find another solution

CDN solutions are more affordable then ever before

run a reverse proxy-cache

Page 19: Php go vrooom!

Pick the right Tools

Page 20: Php go vrooom!

Hardware

Add more CPUs or more cores

Add more RAM

Use RAID or Solid State drives

Network can definitely be a bottleneck –but like PHP it‟s the last thing to fix - hire a really smart guy

Page 22: Php go vrooom!

DatabaseUse indexes people!

Page 23: Php go vrooom!

Profile – Don’t Guess!

Mysql – has profiler built in

Postgresql – turn on logging and use analyzer on logs

SQL Server – built in profiler

MongoDB – built in profiler

Page 24: Php go vrooom!

Analyze your Queries

Do not guess

Add indexes where needed

Sometimes it‟s faster to do the work in PHP

Log on the PHP side, count on the PHP side… then do it on the server side too

Always try to do fewer queries

Page 25: Php go vrooom!

Cache Everything

Query Caching◦ PHP side – cache generated queries

◦ Server side – query cache

Results Caching◦ Memcached is your friend

Libmemcached = php‟s memcached (faster, non-portable)

php sockets = php‟s memcache (slower, completely portable)

◦ File caching – sometimes IO is faster then db

Page 26: Php go vrooom!

Best Practices are “Best” for a Reason

Use transactions as appropriate

Normalize your data (or use nosql)

Minimize connections to the db

Foreign keys can be slower, use cautiously

Page 28: Php go vrooom!

PHP Optimizationecho not print… are you kidding me?

Page 29: Php go vrooom!

Profile – Don’t Guess

XhProf

Xdebug

DBG (free and pay versions)

APD – older but serviceable

Inclued

Memtrack

Scream (also in xdebug)

Page 30: Php go vrooom!

The Boss knows Best

“We should forget about small efficiencies,

say about 97% of the time: premature optimization is the root of all evil.”

- Donald Knuth

“Knowing when optimization is premature defines the difference between the master engineer and the apprentice.”

- Theo Schlossnagle

Page 31: Php go vrooom!

Cache

In-memory sessions are faster than disk or database equivalents. (mm, apc, wincache or memcache)

Cache pages partially, or fully – store in memcache, have apache bypass PHP

Cache any and everything

Cache in layers – browser, full page, partial page, data, query results, application settings

Page 32: Php go vrooom!

Farm it out

Gearman it

Fork it

Cron it

Exec it

Parallelization needs communication though!

Page 33: Php go vrooom!

Avoid Runtime Introspection

Reflection is nice – but it is VERY slow and memory heavy

This kind of job is much better when handed off to C (yaml extension, for example)

Writing extra code is worth the performance improvement

Just because you CAN do something in PHP just like $lang doesn‟t mean that‟s the best solution

Page 34: Php go vrooom!

File and I/O

Avoid lots of stats

Use an opcode cache (yes, I‟m saying it AGAIN)

Try not to have too many files in a directory

include_path as short as possible

Use absolute paths

Page 35: Php go vrooom!

Balance Speed and MaintainabilityAutoload and Includes

“I'm saying that if your autoloader is a significant fraction of the work your app does, then you are either Doing It Wrong™, or really unlikely, Doing It Very Well Indeed™ I know which I favour”

-Michael Maclean

Page 36: Php go vrooom!

Very Bad Things

NFS is of the devil – do not use it

Errors are always created, even if you don‟t see them◦ error_reporting(-1);

@ is terrible! Set and restore error handler if you know something will spit, it‟s STILL faster

Page 37: Php go vrooom!

Micro Optimizations (Here be Evil)

„‟ is a wee bit faster than “”

echo not print

Don‟t use magic methods

++$i not $i++

$_SERVER['REQUEST_TIME'] not time()

static methods are faster

$function() not call_user_func(„function‟)

arrays are faster then objects

Page 38: Php go vrooom!

Resources

http://xdebug.org

https://github.com/jokkedk/webgrind

https://github.com/facebook/xhprof

http://pecl.php.net/package/inclued

https://github.com/eexit/Inclued

http://pecl.php.net/package/scream

http://pecl.php.net/package/memtrack

Page 39: Php go vrooom!

FrameworksSure you wrote the code faster…Trick them into running faster…

Page 40: Php go vrooom!

ORMS

“You are trading „development speed‟ for „processing speed‟ … all you do is waste all day reading docs to produce a half-assed project”

– Bob Majdak Jr

“ORMs are great for automating the sort of query that an idiot could write, and useless for anything non-trivial.”

– Greg Chiasson

http://highscalability.com/blog/2011/5/2/stack-overflow-makes-slow-pages-100x-faster-by-simple-sql-tu.html

Page 41: Php go vrooom!

Frameworks

Remove require/include calls and use autoloader or include_all files

Avoid lots of configuration in parseablefiles (yaml, ini, etc)

Turn off Debug features

Use any sort of database caching available

Watch your “dispatch loops” – write something custom if you need to

Watch Plugin loading of all types

Page 42: Php go vrooom!

Wordpress

Switch to another system (lots of importers)

Use a cache plugin – or two, or three

Keep wordpress up to date

Don‟t use a lot of plugins

Don‟t use the wp-db-abstraction plugin or any other plugin doing crazy things to the core

It‟s just PHP, do all the PHP things too!

Page 43: Php go vrooom!

Drupal, Joomla

Install a Cache plugin

Limit other Pluginsin use

Disable anonymous sessions

Use a simple theme

All the other PHP stuff

Install a Cache plugin

Limit other Pluginsin use

Make sure debugging is off in production

Turn off statistics

All the other PHP stuff

Page 44: Php go vrooom!

Resources

http://groups.drupal.org/high-performance http://codex.wordpress.org/WordPress_Opti

mization http://www.joomlaperformance.com/ http://www.brandonsavage.net/micro-

optimizations-that-dont-matter/ http://weierophinney.net/matthew/archives/

245-Autoloading-Benchmarks.html http://framework.zend.com/manual/en/perfo

rmance.html http://www.endyourif.com/optimizing-

cakephp-websites/ http://trac.symfony-

project.org/wiki/Optimization

Page 45: Php go vrooom!

Write it in CWhen PHP actually IS the problem

Page 46: Php go vrooom!

Questions?

http://emsmith.net

http://joind.in/3422

[email protected]

IRC – freenode – auroraeosrose

#php-gtk #coapp