Uh, the number of open() calls really shouldn't change.  Are you sure you
are comparing the same code?  And how are you testing?  Attach strace or
truss to your running httpd process and hit your script a single time.
Then look at the output and compare them.  Some of the keys to reducing
syscalls:

  - don't use open_basedir or safe_mode restrictions
  - always include/require files by their absolute paths (./foo.inc is ok)
  - if you have to use include_path includes, make sure the dir you
    hit most often is first in the include_path (even before .)
  - optimize your code.  ie. don't use while(!feof($fp)) to loop through
    a file, check the return of your fgets() instead, for example.

In your example, you can of course replace your code with a single call to
file_get_contents() which is a new function in 4.3 and should
significantly reduce your syscall overhead.

4.3.3 will have Sascha's fd-patch which gets rid of a stat() call
associated with every file open, so if you are really keen on reducing
your syscalls even further, you can grab a snapshot.

I also have some hacks we use here at Yahoo that eliminate a bunch of
other calls, but they aren't exactly generic in that they break various
aspects of PHP that in my controlled environment here I am fine with.  I
have been pondering whether to add some sort of --broken-but-fast compile
switch an commit those changes, but it would likely cause a whole lot of
confusion.

-Rasmus

On Wed, 4 Jun 2003, Jeff Moore wrote:

> I remember a discussion about system calls here earlier.  What is the
> status of that?
>
> I've been doing some tests and have found that this code runs about 2.5
> times slower under 4.3.2 than it did on 4.1.2 on the same machine
> (running OS X):
>
> <?php
> $filename = 'file.html';
> $fd = fopen($filename, 'rb');
> $content = fread($fd, filesize($filename));
> fclose($fd);
> echo $content;
> ?>
>
> I did some tests with fs_usage to check file system calls and found
> that for a zero length test.php file, 4.3.2 makes the following
> additional calls beyond 4.1.2:
>
> 1 chdir  /Library/WebServer/Documents/rot/bench
> 1 fchdir
> 12 fstat
> 5 fstatfs
> 5 getdirentries
> 7 lseek O=0x00000000
> 1 lstat test.php
> 6 lstat (., .., ../.., etc.
> 6 open  (., .., ../.., etc)
> 1 stat
>
> The fread example above made the following additional calls in 4.3.2
> beyond 4.1.2:
>
> 2 chdir /Library/WebServer/Documents/rot/bench
> 2 fchdir
> 32 fstat
> 15 fstatfs
> 15 getdirentries
> 16 lseek O=0x00000000
> 1 lstat  file.html
> 1 lstat test.php
> 18 lstat (., .., ../.., etc.)
> 17 open  (., .., ../.., etc)
> 4 stat
> 1 stat .
>
> some of my counts my be slightly off - I counted them by hand.
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>

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

Reply via email to