Upload
elizabeth-smith
View
2.179
Download
0
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
PHP Go VROOOM!How to take a site from slow to go
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
PHP is NOT your problem!**95.99% of the time
Why your app is slow…
Client Side
Server Side
IO
Database
Frameworks
Hardware
Let the Lecture Begin!
Client SideDo you want some Expires with that?
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/
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
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
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
Cookies (om nom nom)
Keep them small
Keep them very domain specific
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)
Client Side Caching
Use cache control headers!◦ Expires
◦ Last-Modified
◦ (best)
◦ Cache-Control
◦ Etag
◦ (harder to get right)
Be kind to proxies as well
Reference
http://developer.yahoo.com/performance/rules.html
http://code.google.com/speed/page-speed/docs/rules_intro.html
http://www.w3.org/Protocols/rfc2616/rfc2616.html
Use the Google
Server SetupHave you hugged your sysadmin today?
Profile, Don’t Guess!
Apache Bench
Siege
Http_Load
JMeter
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
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
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
Pick the right Tools
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
Resources
http://assets.en.oreilly.com/1/event/44/Scalable%20Internet%20Architectures%20Presentation%202.pdf
http://ilia.ws/files/Moscow2010_Optimization_Mistakes.pdf
http://people.apache.org/~sctemme/ApconEU2006/FR4/FR4_Performance_Up.pdf
http://omniti.com/surge/2011
DatabaseUse indexes people!
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
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
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
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
Resources
http://dev.mysql.com/doc/refman/5.0/en/optimization.html
http://wiki.postgresql.org/wiki/Performance_Optimization
http://msdn.microsoft.com/en-us/library/ff647793.aspx
PHP Optimizationecho not print… are you kidding me?
Profile – Don’t Guess
XhProf
Xdebug
DBG (free and pay versions)
APD – older but serviceable
Inclued
Memtrack
Scream (also in xdebug)
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
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
Farm it out
Gearman it
Fork it
Cron it
Exec it
Parallelization needs communication though!
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
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
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
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
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
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
FrameworksSure you wrote the code faster…Trick them into running faster…
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
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
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!
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
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
Write it in CWhen PHP actually IS the problem
Questions?
http://emsmith.net
http://joind.in/3422
IRC – freenode – auroraeosrose
#php-gtk #coapp