Hello,
These days I've been working on some tasks to reduce I/O system calls
(lstat64, stat64, open and so on) of PHP for some reasons and
as the result of it, I noticed that with the APC + very small two
pathes we can suppress most of realpath() calls (although currently
I'm not sure this is the correct method or not...):
http://eth.jp/php-cvs-20040506-delayed-fopen.patch.txt
(patch against current 4.3 tree, because APC is not yet fully
compatible with PHP 5)
http://eth.jp/apc-2.0.3-delayed-fopen.patch.txt
(patch against APC-2.0.3, current CVS-HEAD is somehow unstable...)
So please try and review if you're curious about suppressing
realpath() calls:)
Usage:
1) apply patches to current 4.3 tree, and APC-2.0.3
2) buidconf and configure PHP as always with --enable-delayed-fopen
option
3) build and install PHP and APC as always
4) add "delayed_fopen=1" entry to your php.ini
And details are as follows:
As the recent thread and some other threads show (which listed below),
PHP requires quite a few I/O system calls especially when large number
of scripts are include_once()ed. And these are not ignorable
for the websites with more than 1 million hits per hour although it
has nothing to do with small sites.
[Performance Consideration of 1 class per file]
http://marc.theaimsgroup.com/?l=php-dev&m=108279256414391&w=2
[Performance degradation]
http://www.phpbuilder.com/lists/php-developer-list/2003022/0226.php
The main concern here is the lstat64() by realpath(), and open() by
searching for include_paths (when many include_paths are set).
I think suppressing open() (which will result in ENOENT) is not so
easy (because we need some other new caching system for
include_paths), but perhaps we can easily reduce realpath() for
included scritpts with APC, because APC does not use an opned file
handle when cache hits.
So, my patch skips zend_open() until open_file_scanning() is called
inside zend_compile_file() when include_once() or require_once() is
called, so that zend_open() is not called when the target script is
cached in APC. As a result of this, we can reduce most of realpath()
calls by include_once() and required_once().
These patches are not yet verified well so comments are welcome!
Best regards,
Masaki Fujimoto
fujimoto@php.net