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

Related:

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 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) - module (34) - php compiled code (32) - cache page script php (25) - Php intermediate code (25) - speedy php (23) - cache code in php (19) - php intermediate page (17) - php cache comparison (13) - php compile time caching (13) - scaling (12) - apache cache optimization (10) - php speedy (8) - www.sex.marrakech (6) - sex (6) - zend intermediate code (5) - php apc leopard (5) - intermediate code (4) - php intermediate (4) - mmcache php 5.16 (4) - leopard apc php (4) - ioncube leopard (4) - php cache cgi (4) - php-cgi memcache (3) - apc versus phpa (3) - php caching script (3) - apc cache cgi (3) - Alternative PHP Cache cgi (3) - php5 cache (3) - intermediate code wikipedia (3) - F (3) - marrakech sex (3) - speedy cache (3) - leopard php apc (3) - php apc statistic (3) - PHP Caching and Optimization (3) - php cgi apc (3) - memcache vs apc (3) - php optimizer comparison (3) - php optimizer (3) - php cache query (3) - alternative php cache benefits (3) - php caching (3) - doggy (3) - php cache off (3) - php optimize generation time (3) - php request performance (3) - java memcached vs php memcached (2) - sex marakech (2) - php Memcache (2) - www pink tv com marrakech maroc (2) - apc zend (2) - php compile cache (2) - zend cach memcache (2) - code caching (2) - php apc vs query (2) - php code caching (2) - include once vs require once php (2) - leopard ioncube (2) - apc vs zend wordpress (2) - xcache apc (2) - eaccelerator vs zend optimization suite (2) - zend platform comparison cache (2) - php cache optimization (2) - install apc leopard server (2) - php apc vs memcached (2) - php cache compare (2) - zend sex.com (2) - zend optimizer leopard server (2) - zend cache (2) - php cache mysql (2) - PHP caching includes (2) - how php speedy works (2) - php accelerator leopard (2) - www pink com marrakech (2) - php domdocument vs include performance (2) - apc query (2) - ZendOptimizer vs eAccelerator (2) - php speedy not caching (2) - php cgi cache (2) - php apc statistics (2) - PHP Accelerator work with zend 2 and php5 (2) - require once vs include once php (2) - Zend Platform vs Apache (2) - Zend Platform Performance Suite (2) - php cgi vs module performance (2) - zend platform vs memcached (2) - wordpress php acceleration (2) - Alternative PHP Cache with php cgi (2) - sexy arab mans (2) - php require vs include performance (2) - php apc includes (2) - zend platform vs apc (2) - 89 com (2) - sex in Marrakech (2) - sex marrakech (2) - zend memcache php (2) - cache query php (2) - php compile intermediate (2) - php speedy alternative (2) - PHP5 caching (2) - Zend Code Acceleration problem (2) - PHP code for train stops (2) - mac osx 10 5 leopard ioncube (2) - php include once vs include (2) - php caching off (2) - memcached vs eaccelerator (2) - memcache vs zend cache (2) - install PHP APC in leopard (1) - require once vs include speed (1) - leopard PHP install APC (1) - zend compile memcache (1) - mysql php cache (1) - zend platform vs (1) - php5 acceleration (1) - APC vs memcache (1) - php cache code (1) - php apc versus zend optimizer platform (1) - zend cache file Memcached (1) - install apc cache os x (1) - apc php cgi (1) - php cache issue require once (1) - php-cgi cache (1) - zend cache page tags (1) - sex:marrakech (1) - apache php cgi compare (1) - acceleration vs apc (1) - php memcache apc comparison (1) - what is zend intermediate (1) - php leopard apc (1) - caching ioncube files (1) - php code optimization and caching pdf (1) - cache comparison mysql memcache (1) - php accelerator vs memcache (1) - Alternative PHP Cache charts (1) - apc code optimization (1) - compiled php vs apc (1) - php5 code optimization (1) - xcache apc compare (1) - Zendoptimizer Leopard (1) - apc memcache file library php (1) - apc vs. memcache (1) - xcache apc memcache (1) - optimize APC php (1) - memcached versus Zend (1) - php include vs require speed (1) - apc caching vs zend (1) - memcache vs files php (1) - APC cache on Mac os x (1) - php include with cache (1) -