Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:38980 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 11178 invoked from network); 15 Jul 2008 18:40:42 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 15 Jul 2008 18:40:42 -0000 Authentication-Results: pb1.pair.com header.from=rasmus@lerdorf.com; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=rasmus@lerdorf.com; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain lerdorf.com from 204.11.219.139 cause and error) X-PHP-List-Original-Sender: rasmus@lerdorf.com X-Host-Fingerprint: 204.11.219.139 mail.lerdorf.com Received: from [204.11.219.139] ([204.11.219.139:43719] helo=mail.lerdorf.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 4F/E9-11609-92FEC784 for ; Tue, 15 Jul 2008 14:40:41 -0400 Received: from trainburn-lm.corp.yahoo.com (trainburn-lm.corp.yahoo.com [207.126.233.11]) (authenticated bits=0) by mail.lerdorf.com (8.14.3/8.14.3/Debian-4) with ESMTP id m6FIecsW024034; Tue, 15 Jul 2008 11:40:38 -0700 Message-ID: <487CEF26.7030802@lerdorf.com> Date: Tue, 15 Jul 2008 11:40:38 -0700 User-Agent: Thunderbird 2.0.0.4 (Macintosh/20070604) MIME-Version: 1.0 To: Amir Hardon CC: PHP Internals List References: <1216133436.6875.35.camel@amirh> In-Reply-To: <1216133436.6875.35.camel@amirh> X-Enigmail-Version: 0.95.6 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by milter-greylist-3.0 (mail.lerdorf.com [204.11.219.139]); Tue, 15 Jul 2008 11:40:38 -0700 (PDT) Subject: Re: [PHP-DEV] lstat call on each directory level From: rasmus@lerdorf.com (Rasmus Lerdorf) 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: > > $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