Stanislav Malyshev wrote:
> Hi!
>
>> A good point.  Fortunately, most streams do store the filename in the
>> stream struct, so this would still probably be possible in the majority
>> of cases.  If not available, the original requested filename is used
>> (the one from the fopen call), so opcode caches probably could just use
>> that.
>
> The problem is, by then the stream will already be opened, i.e. extra
> filesystem call is done.
Hi,

Yes, but let's not forget we're talking about making this:

<?php
if ($fp = @fopen($file, 'r', true)) {
    fclose($fp);
    include $file;
}
// 2 stats, fopen + include
?>

into this:

<?php

if ($fp = @fopen($file, 'r', true)) {
        include($fp);
        fclose($fp);
}
// 1 stat, fopen
?>

Of course 1 stat is worse than no stats.  Perhaps better would be to introduce 
a function:

if (can_include($file)) {
    include $file;
}

opcode caches could easily snag this, as we could provide a simple hook the way 
we do with stream_resolve_path().  That would actually make a 0-stat smart 
autoloader a possibility.  Just in case it isn't obvious, can_include() would 
be the equivalent to an include_path search followed by is_readable(), which is 
essentially what the fopen() hack does now.  can_include() would also remove 
the unnecessary opening of the file that fopen() performs.

Greg


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

Reply via email to