On Sat, 24 Apr 2004, George Schlossnagle wrote:
> > What do you mean by that?  APC doesn't require anything near a
> > realpath.
> > If you get rid of realpath() in PHP, APC will work just fine.  With my
> > syscall hacks I am using APC this way and I just have 1 stat per file.
> > The only visible difference is when you ask APC which files it has
> > cached
> > and it doesn't return full-path filenames but rather just the paths
> > used
> > to include the files.
> >
> > For the top file there is no stat in PHP/APC at all anymore as we
> > inherit
> > the stat struct from Apache (which I guess is what you are alluding to)
> > and then for each include file only a single stat is needed.  That is
> > nowhere near the equivalent of a realpath which adds N stats per file
> > where N is the depth of the file in the directory structure.
>
> Yes, that was what I was alluding to.  That only works for the top
> level file though, not any includes.  Without that though, you need to
> call apc_stat_paths(), which does this:
>
>      paths = apc_tokenize(path, ':');    /* TODO - on windows, it's ';'
> */
>      if (!paths)
>          return -1;
>
>      /* for each directory in paths, look for filename inside */
>      for (i = 0; paths[i]; i++) {
>          snprintf(filepath, sizeof(filepath), "%s/%s", paths[i],
> filename);
>          if (stat(filepath, buf) == 0) {
>              found = 1;
>              break;
>          }
>      }
>
> And while not a realpath(), it does a similar sort of search (path here
> is the include_path for those following along at home).  Fully
> qualifying your paths makes up for this, and the next best thing is to
> make sure your include_path is tight and optimally ordered.

Well, I disagree that this is anything like a realpath().  If your PEAR
directory is the first thing in the include_path (as in get rid of "."
from it) then this is a single stat call on any PEAR include regardless of
how deep your directory structure is.  Compared to realpath where
including XML_RSS/RSS.php from a PEAR path of /usr/local/php/pear would be
6 stats.

We can't avoid a single stat per file, and on include_path includes we
can't avoid a single stat per attempted include_path component.  The
single stats don't worry me very much and we could reduce this with an
intelligent request-spanning stat cache system.

-Rasmus

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to