On Sat, 2003-01-25 at 00:17, Rasmus Lerdorf wrote: > Take this script: > > <? include '/home/rasmus/foo/u2.inc' ?> > > So, a simple include with an absolute pathname to avoid any include_path > searching and all safe_mode and open_basedir checking turned off. The > latter of course being an absolute killer. We still need a lot of system > calls to handle this include: > > getcwd("/home/rasmus", 4096) = 13 > lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 > lstat64("/home/rasmus", {st_mode=S_IFDIR|0777, st_size=45056, ...}) = 0 > lstat64("/home/rasmus/foo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 > lstat64("/home/rasmus/foo/u2.inc", {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 > open("/home/rasmus/foo/u2.inc", O_RDONLY) = 3 > fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 > fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 > fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 > mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >0x4002c000 > _llseek(3, 0, [0], SEEK_CUR) = 0 > lseek(3, 0, SEEK_SET) = 0 > > The 4 lstat64() calls here are due to calling realpath() which causes > every dir leading up to the filename to be stat'ed to check if it is a > link so we can normalize the filename before adding it to the included > files list. It's handy and nice to normalize the path here, but it is > really really expensive! And this overhead doesn't go away with opcode > caches either as they still need to go through this step to determine if > the included file has been cached or not. I also don't see the point of > those three fstat64() calls that I guess are a result of the sanity > checking we do after the fopen. > > Due to our current implementation, if you have a lot of includes, you > really should put all your include files in / and you will see some > impressive improvements. This is annoying, but I am not sure how to fix > it. A couple of things crossed my mind: > > 1. Don't normalize the path names, but instead do a single stat on the > file and record the device and inode of it and use that to match it > up later to check for multiple inclusion and the various opcode > caches would use that as a cache key. > > 2. Add a fast_include directive, or something equally lame-sounding, > which skips the getcwd(), realpath() and sanity checks and just > includes the file. > > 3. For absolute paths, don't call realpath() to normalize, just strip > out multiple /'s and any .'s or whatever we think is necessary to > try to normalize it short of having to stat every single dir leading > up to the file. > > 4. Do some sort of caching on this info so it doesn't happen on every > include on every request.
Zend Accellerator has a config setting for disabling getcwd(), I think that would be a viable option for PHP too, rather than a separate include statement. Don't you have any FreeBSD kernel hackers in Y!? You could probably convince/bully one of them to fix it, that's what we always do with ours here ;-) - Stig -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php