View stunning SlideShares in full-screen with the new iOS app!Introducing SlideShare for AndroidExplore all your favorite topics in the SlideShare appGet the SlideShare app to Save for Later — even offline
View stunning SlideShares in full-screen with the new Android app!View stunning SlideShares in full-screen with the new iOS app!
PHP Go VROOOM! How to take a site from slow to go
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 rantDisclaimer
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 dimensionsCSS
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 layoutsImages
Keep them small Keep them very domain specificCookies (om nom nom)
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)HTTP Requests
Use cache control headers! ◦ Expires ◦ Last-Modified ◦ (best) ◦ Cache-Control ◦ Etag ◦ (harder to get right) Be kind to proxies as wellClient Side Caching
http://developer.yahoo.com/performance/ rules.html http://code.google.com/speed/page- speed/docs/rules_intro.html http://www.w3.org/Protocols/rfc2616/rfc2 616.html Use the GoogleReference
Server SetupHave you hugged your sysadmin today?
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, DatabaseUpgrade your Software
“memcache does precisely f**k all for opcode caching” – Michael MacleanThis is the #1 best way to speed up your PHP siteInstall APC (or something)
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-cacheDon’t Use PHP and Use a CDN
Mysql – has profiler built in Postgresql – turn on logging and use analyzer on logs SQL Server – built in profiler MongoDB – built in profilerProfile – Don’t Guess!
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 queriesAnalyze your Queries
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 dbCache Everything
Use transactions as appropriate Normalize your data (or use nosql) Minimize connections to the db Foreign keys can be slower, use cautiouslyBest Practices are “Best” for aReason
PHP Optimizationecho not print… are you kidding me?
XhProf Xdebug DBG (free and pay versions) APD – older but serviceable Inclued Memtrack Scream (also in xdebug)Profile – Don’t Guess
“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 SchlossnagleThe Boss knows Best
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 settingsCache
Gearman it Fork it Cron it Exec it Parallelization needs communication though!Farm it out
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 solutionAvoid Runtime Introspection
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 pathsFile and I/O
“Im 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 MacleanBalance Speed and MaintainabilityAutoload and Includes
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 fasterVery Bad Things
„‟ 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 objectsMicro Optimizations (Here be Evil)
FrameworksSure you wrote the code faster…Trick them into running faster…
“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 Chiassonhttp://highscalability.com/blog/2011/5/2/stack- overflow-makes-slow-pages-100x-faster-by- simple-sql-tu.htmlORMS
Remove require/include calls and use autoloader or include_all files Avoid lots of configuration in parseable files (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 typesFrameworks
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!Wordpress
Install a Cache Install a Cache plugin plugin Limit other Plugins Limit other Plugins in use in use Disable anonymous Make sure sessions debugging is off in Use a simple theme production All the other PHP Turn off statistics stuff All the other PHP stuffDrupal, Joomla