So I’m working on a project written in old-style (no OOP) PHP with no full rewrite in the near future. One of the problems with it currently is that its slow—much of the time is spent requireing over 100 files based on where it is in the boot process.
I was wondering if we could condense this (on deployment, not development of course) into a single file or two with all the require‘d text just built in. However, since there are so many lines of code that aren’t used for each page, I’m wondering if doing this would backfire.
At its core, I think, it’s a question of whether:
<?php
echo 'hello world!';
?>
is any faster than
<?php
if(FALSE) {
// thousands of lines of code here
}
echo 'hello world!';
?>
And if so, how much slower?
(Also, if what I’ve outlined above is a bad idea for some other reasons, please let me know.)
The difference between the two will be negligible. If most of the execution time is currently spent requiring files you’re likely to see a significant boost by using an optcode cache like APC, if you are not already.
Other than that – benchmark, find out exactly where the bottlenecks are. In my experience requires are often the slowest part of an old-style procedural PHP app, but even with many included files I’d be surprised if these all added up to a ‘slow’ app.
Edit: ok, a quick ‘n dirty benchmark. I created three ‘hello world’ PHP scripts like the example. The first (basic.php) was just echoing the string. The second (complex.php) included an if false statement that contained ~5000 lines of PHP code pasted in from another app. The third (require.php) included the same if statement but required in the ~5000 lines of code from another file.
Page generation time (as measured by microtime()) between basic.php and complex.php was around ~0.000004 seconds, so really not significant. Some more comprehensive results from apache bench:
without APC with APC req/sec avg (ms) req/sec avg (ms) basic.php: 7819.87 1.277 6960.49 1.437 complex.php: 346.82 2.883 352.12 2.840 require.php: 6819.24 1.446 5995.49 1.668APC’s not doing a lot here but using up memory, but it’s likely to be a different picture in a real world app.