On Tue, 2008-07-15 at 11:40 -0700, Rasmus Lerdorf wrote:

> Amir Hardon wrote:
> > I've noticed a weird behavior when doing file access from PHP:
> > PHP seems to make an lstat call on each of the parent directories of the
> > accessed file, for example see this script:
> > 
> > <?php
> > $fp=fopen("/var/www/metacafe/test","r");
> > fclose($fp);
> > ?>
> > 
> > When running with strace -e lstat I see this:
> > lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
> > lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
> > lstat("/var/www/metacafe", {st_mode=S_IFDIR|0755, st_size=4096, ...}) =
> > 0
> > lstat("/var/www/metacafe/test", 0x7fbfff9b10) = -1 ENOENT (No such file
> > or directory)
> > 
> > Measuring total syscalls time for an apache process on a production
> > server, I found out
> > that ~33% of the time it spends in syscalls is spent on lstat.
> > 
> > I did a pretty deep web search on the issue and came out with nothing.
> > I'll also note that I did a small experiment - moving our root portal
> > folder to /,
> > this gave an amazing performance improvement!
> > 
> > So my questions are:
> > What is the reason for doing these lstat calls?
> > How can it be disabled? if not by configuration, maybe by patching php
> > (can you direct me to where is this being done in php's source?)
> 
> That's a realpath() call and it should be getting cached by the realpath 
> cache, so if you are seeing these on every request, try increasing your 
> realpath_cache size in your .ini.  Without checking the realpath, you 
> would be able to circumvent open_basedir checking really easily with a 
> symlink.
> 
> -Rasmus


I've already increased the realpath_cache to the point it didn't give
any more benefit(And it did give benefit),
but there are still many lstat calls, and still placing our portal dir
in the root directory gave a huge performance benefit(After fine-tuning
realpath_cache).
We don't use open_basedir.

I think it might be wise to make this dir check configurable, as the
performance impact is major.
Anyway - can you please direct me to the place where this check is made
in php's source, so I'll be able to disable it manually?


Thanks!
-Amir.

Reply via email to