ID:               28820
 User updated by:  benjcarson at digitaljunkies dot ca
 Reported By:      benjcarson at digitaljunkies dot ca
 Status:           Wont fix
 Bug Type:         Filesystem function related
 Operating System: Linux
 PHP Version:      5CVS-2004-06-17 (dev)
 New Comment:

Thanks for the explanation & the doc fix.  What you say makes perfect
sense.


Previous Comments:
------------------------------------------------------------------------

[2004-06-18 00:29:52] [EMAIL PROTECTED]

On the note about parse_url(), no fopen() does not call parse_url to
determine wrapper usage.

The reason relative paths are not supported with the file:// wrapper
comes down to a compromise in how UNC paths are dealt with (and more
specifically how / are fuzzily interpreted as \ for windows
installations).

For Example:

file://foo/bar

Could be interpreted as a relative URI:  foo/bar  from the current
working directory, OR it could be interpreted as a UNC:  \\foo\bar 
(share `bar` on computer `foo`).

For this and a few internal reasons the file:// wrapper is limited to
absolute paths when called explicitly.  For relative paths either use
realpath() {as you did in your report}, or omit the explicit naming of
the file wrapper.

I notice that the wording on http://www.php.net/wrappers regarding
relative paths is a touch ambiguous.  I'll update that to show that
only absolute paths are supported when explicitly naming the wrapper.


------------------------------------------------------------------------

[2004-06-17 22:39:25] benjcarson at digitaljunkies dot ca

Description:
------------
When using fopen_wrappers, if a relative path is prepended with
'file://', fopen() and friends fail and emit a warning about remote
access being unsupported for file access.  fopen() succeeds if
'file://' is omitted.

On a possibly related note, parse_url("file://test.php") returns
array(scheme => "file", host => "test.php").  I would imagine this is
the desired behaviour for remote protocols (e.g. 'http://php.net'). 
However, if the fopen wrapper for 'file://' is calling parse_url()
internally, this could explain why the error message is complaining
about remote hosts.  I'm not familiar with the stream internals,
though, so I might be way off here...

And just in case anyone asks:

[EMAIL PROTECTED]:test$ php -r 'print_r(stream_get_wrappers());'
Array
(
    [0] => php
    [1] => file
    [2] => http
    [3] => ftp
    [4] => compress.bzip2
    [5] => compress.zlib
    [6] => https
    [7] => ftps
)



Reproduce code:
---------------
#!/usr/bin/php
<?php
// Note: 'test.php' exists in the current directory
$filename = "test.php";
$f1 = fopen($filename, "r");                       // works
$f2 = fopen("file://". $filename, "r");            // fails
$f3 = fopen(realpath($filename), "r");             // works
$f4 = fopen("file://" . realpath($filename), "r"); // works
?>

Expected result:
----------------
(no output)

Actual result:
--------------
Warning: fopen(): remote host file access not supported,
file://test.php in ./file_get_contents.php on line 6

Warning: fopen(file://test.php): failed to open stream: no suitable
wrapper could be found in ./file_get_contents.php on line 6



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=28820&edit=1

Reply via email to