Speedy PHP: Intermediate Code Caching

I’ve been working on MySQL optimization for a while, and though there’s still more to done on that front, I’ve gotten to the point where the the cumulative query times make up less than half of the page generation time.

So I’m optimizing code when the solution is obvious (and I hope to rope Zach into giving the code a performance audit soon), but I’m also looking at optimizing how PHP works.

Once upon a time, most of us ran PHP as a CGI, and every time a request came in, the PHP interpreter would have to launch, read/compile/execute the script, then spit out the result and shutdown. Now (hopefully) everybody’s running PHP as an Apache module, so all the time spent launching the interpreter, allocating memory and other resources for it, and then shutting it down and cleaning up after it, is done just once for each thread of Apache.

It might not sound like much, but I had a chance to compare CGI vs. module performance recently and found that a fairly simple, but frequently accessed script running as a CGI completely swamped a server as a CGI (creating a load average over 20), but was hardly noticed when running as a module.

But even as a module, the PHP scripts still need to be interpreted and compiled before they can be executed. And because of the way PHP works, this is done every time the page/script is requested.

Java programmers, among others, criticize PHP for this, but that small inefficiency is part of what makes PHP so easy to use (and popular). And that ease of use means people are building some really interesting apps worth scaling.

Anyway, there’s a solution to eliminate that inefficiency in PHP: intermediate code caching.

By caching the executable code generated by the interpreter, then the using the cached copy instead of the source script for the next request, you can enjoy the benefits of PHP’s easy development and compiled code’s fast execution time. A number of projects all promise anywhere from double to 10X jump in performance.

I haven’t actually tried any of these yet, but I’m looking for information and suggestions, and I’m likely to try APC, maybe even Zend soon. Just as soon as I make an app compelling enough (and large enough) to need it.

php, caching, acceleration, zend, apc, intermediate code cache, optimization, scaling, web applications

5 Comments

  1. Comment by unwesen on May 31, 2007 4:39 pm

    Back in the day, when the company I was working for was one of the early adopters of the Zend Optimizer, you sometimes got into situations where the cache would not recognize if you changed a source file included by the main file you were executing. Because that seriously got into the way of short development cycles, and introduced a number of “fake” bugs that vanished once you turned the cache off, we used to develop without the cache. That, on the other hand, changed the timing of each script, and we got more (or less) contention on the underlying MySQL DB.

    I guess what I’m trying to say is a) don’t believe this’ll solve every problem and b) I’d be curious about how other solutions or more modern versions of the Zend stuff work out. Not curious enough to try them out, though, I’ve left PHP behind for the most part ;)

  2. Comment by Maryam in Marrakech on June 1, 2007 1:00 pm

    This all sounds incredibly important and I truly wish I understood it…because I know I need to be worrying about all these things on my blog too….HELP!
    Signed blogging damsel in distress in Marrakesh

  3. Pingback by » Easy MySQL Performance Tips on June 6, 2007 8:13 am

    [...] I’m still trying to squeeze more performance out of MySQL. And since small changes to a query can make a big [...]

  4. Comment by Nick on April 28, 2008 10:10 am

    Stumbled here by accident, and though it’s a year old now thought I’d clarify the ionCube PHPA license. It is and always has been free, but do note that it reached end of life some time ago and EAccelerator is probably the best choice these days although we do have a new performance product that has not been released yet.

    Back in 2001 when I created the PHP Accelerator it was a massive shock to Zend. There was APC and a few other opensource caches, but they were all 30% or so slower than Zend Cache. I’d been using PHP for only a few days when I realised that it was quite slow and that there had to be a way to speed it up, so I started looking at caching. I didn’t know about the other caches at the time, although when I did I realised that they were clearly missing a trick as their performance was poor in comparison to Zend.

    Following a frantic 3 weeks of development, PHPA was usable and the first cache to match or run faster than Zend Cache, with the crucial trick being to execute code directly from SHM.

    After releasing the PHP Accelerator for others to benefit, Zeev Suraski got in touch asking what the intentions were; he was clearly worried, and concerned that their monopoly on the PHP market was being threatened. As a gesture of good will I made a promise not to release the source, so it remained closed source but free and maintained for several years, and adopted by countless sites globally from hobby sites to large enterprises such as Yahoo.

    After steering the APC developers in the right direction to improve their cache, and with other developers taking an interest in PHP internals, more caches appeared over time and there are several choices. EAccelerator, a fork of the dead mmcache project, APC, and the promising newcomer XCache are all worthy. EAccelerator in particular benefits from some good code optimisation strategies, helping to boost performance further.

  5. Comment by Casey Bisson on April 30, 2008 10:10 pm

    @Nick: Thanks for the details. APC has been working well for me here, but perhaps I should look around again.

Comments RSS TrackBack Identifier URI

Leave a comment

 

User contributed tags for this post:

apc php acceleration (54) - Php intermediate code (46) - module (34) - php compiled code (32) - speedy php (30) - php intermediate page (25) - cache page script php (25) - php cache comparison (20) - cache code in php (19) - php speedy (14) - php compile time caching (13) - intermediate code (12) - comments (12) - scaling (12) - apache cache optimization (10) - php cgi cache (9) - php intermediate (9) - php compile cache (8) - zend intermediate code (8) - php apc leopard (8) - zend memcached (7) - php cache code (7) - zend memcache (7) - memcached vs eaccelerator (7) - php speedy alternative (7) - php cache cgi (6) - eAccelerator vs memcached (5) - speedy cache (5) - php apc statistics (5) - apc zend (5) - code caching (5) - php cache query (4) - php accelerator leopard (4) - leopard apc php (4) - php apc vs memcached (4) - apc cache cgi (4) - www.pink.tv.com (4) - alternative php cache benefits (4) - speedyphp (4) - zend cache memcached (4) - ioncube leopard (4) - php caching script (4) - cache php cgi (4) - php apc cache and require once (4) - mmcache php 5.16 (4) - PHP cache script (4) - php cgi caching (4) - zend cache PLUGIN (4) - php-cgi memcache (4) - apc php cgi (4) - php-cgi cache (4) - intermediate code wikipedia (4) - leopard php memcache (4) - memcache vs apc (4) - php optimizer comparison (4) - scaling php-cgi (3) - php-cgi apc (3) - PHP Caching and Optimization (3) - php caching and optimizing PHP intermediate code. (3) - php cache compare (3) - zend optimizer leopard server (3) - php caching off (3) - php memcache alternative (3) - php memcache leopard (3) - apc php leopard (3) - php cache off (3) - zend platform vs apc (3) - leopard php apc (3) - php cgi apc (3) - php cgi vs module performance (3) - F (3) - doggy (3) - php optimizer (3) - memcache vs zend cache (3) - apc versus phpa (3) - php optimize generation time (3) - php5 cache (3) - Alternative PHP Cache cgi (3) - php memcache alternatives (3) - php apc vs memcache (3) - php caching (3) - LEOPARD php-cgi: not found (3) - php speedy zend (3) - zend cache vs apc (3) - php apc statistic (3) - PHP caching includes (3) - php request performance (3) - www pink com marrakech (2) - zend cache vs memcache (2) - eaccelerator vs zend optimization suite (2) - leopard php cgi (2) - zend memcache php (2) - PHP5 caching (2) - PHP Accelerator work with zend 2 and php5 (2) - leopard php memcached (2) - apc query (2) - apc php-cgi (2) - ZendOptimizer vs eAccelerator (2) - zend php speedy (2) - php domdocument vs include performance (2) - php include once vs include (2) - java memcached vs php memcached (2) - php cache mysql (2) - zend platform comparison cache (2) - zend cache vs memcached (2) - intermediate page php (2) - php require vs include performance (2) - zend cache memcache (2) - benefits php cache (2) - apc vs zend wordpress (2) - www pink tv com marrakech maroc (2) - how php speedy works (2) - zend cache (2) - how to make query speedy (2) - install apc leopard server (2) - Alternative PHP Cache with php cgi (2) - zend cach memcache (2) - Zend Code Acceleration problem (2) - zend platform vs memcached (2) - php speedy with memcached (2) - xcache vs memcache (2) - php cache comparisons (2) - PHP interpreter cache (2) - mmcache vs xcache (2) - php apc includes (2) - php interpreter caching (2) - include once vs require once php (2) - memcache vs xcache (2) - Alternative PHP Cache vs eAccelerator (2) - 89 com (2) - php apc with cgi (2) - apc leopard php (2) - Zend Platform Performance Suite (2) - integrate php speedy with zend (2) - php code cache cgi (2) - benefits Alternative PHP Cache (2) - zend cache page (2) - php compile intermediate (2) - php-cgi leopard (2) - PHP code for train stops (2) - apc php optimizer (2) - mac osx 10 5 leopard ioncube (2) -