Hi Greg,

In general include_path cannot contain pathes with ':' character,
because it is the POSIX path separator.
So I don't see a way to use stream wrappers in include_path. :(

Thanks. Dmitry.

> -----Original Message-----
> From: Gregory Beaver [mailto:[EMAIL PROTECTED] 
> Sent: Friday, March 07, 2008 8:06 AM
> To: Dmitry Stogov; internals Mailing List
> Subject: [PATCH] adding stream wrappers to include_path
> 
> 
> Hi,
> 
> I found some time to whip up a quick patch against 5.3.
> 
> This patch allows adding stream wrappers to include_path on 
> both windows and unix.  This means one can set an 
> include_path to 
> ".:/usr/local/lib/php:phar:///path/to/ZF.phar/lib" or the 
> windows equivalent ".;C:\php5;phar://C:/php5/ZF.phar/lib"  
> Any stream wrapper, userspace or built-in, will work as long 
> as it satisfies security constraints and implements 
> url_stat(), stream_open(), stat(), and read() or the C equivalents.
> 
> In other words, this test I already had created for pecl/phar works:
> 
> <?php
> $fname = dirname(__FILE__) . '/tempmanifest1.phar.php';
> $a = new Phar($fname);
> $a['file1.php'] = 'file1.php
> ';
> $a['test/file1.php'] = 'test/file1.php
> ';
> unset($a);
> set_include_path('.' . PATH_SEPARATOR . 'phar://' . $fname); 
> include 'file1.php'; set_include_path('.' . PATH_SEPARATOR . 
> 'phar://' . $fname . '/test'); include 'file1.php'; include 
> 'file2.php'; ?> ===DONE===
> 
> with output:
> 
> --EXPECTF--
> file1.php
> test/file1.php
> 
> Warning: include(file2.php): failed to open stream: No such 
> file or directory in %sinclude_path.php on line %d
> 
> Warning: include(): Failed opening 'file2.php' for inclusion
> (include_path='.:phar:///home/cellog/workspace/php5/ext/phar/t
> ests/tempmanifest1.phar.php/test')
> in %sinclude_path.php on line %d
> ===DONE===
> 
> The internals of the patch borrows logic from 
> php_stream_locate_url_wrapper to quickly detect a stream 
> wrapper.  It excludes the data stream wrapper out of hand as 
> this has no business in include_path for obvious reasons.  It 
> also fully supports disabled 
> allow_url_fopen/allow_url_include by passing 
> STREAM_OPEN_FOR_INCLUDE to the eventual 
> php_stream_locate_url_wrapper call.  The most important part 
> of the patch is the way it finds a stream wrapper on unix.  
> Because PATH_SEPARATOR is ":" on unix, the include_path 
> scanner will stop after "phar" in the sample include_paths 
> above.  The new scanner checks for a valid stream wrapper (a 
> sequence of alpha-numeric, +, -, or . characters followed by 
> ://) and seeks to the next : if found.
> 
> My primary concern with the patch is performance.  I'm 
> certain it can be tweaked.  I extracted the call to url_stat 
> from php_stream_stat(), which removes the possibility of 
> hitting stat cache but eliminates the redundant call to 
> php_stream_locate_url_wrapper.  If it is indeed faster to use 
> php_stream_stat(), that's one easy optimization.
> 
> In any case, it adds an additional scan of each include_path 
> component to detect stream wrappers, which is called on each 
> include.  This may be the biggest candidate for optimization, 
> as a simple cache of paths with stream wrapper/not could be 
> created whenever include_path is set and used instead of 
> scanning the string every time.
> 
> By the way, there may be some unsafe scans in 
> php_stream_locate_url_wrapper, specifically line 1531 in PHP_5_3:
> 
>     if ((*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || 
> !memcmp("data", path, 4))) {
> 
> It doesn't seem to verify that path is at least 4 or there is 
> at least 2 extra characters after p before checking for "//" or "data"
> 
> Thanks,
> Greg
> 

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

Reply via email to