problem with include_path and write-based file functions
| From: | Gregory Beaver | Date: | Tue, 09 Dec 2008 19:50:21 +0000 |
| Subject: | problem with include_path and write-based file functions | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-42207@lists.php.net to get a copy of this message | ||
Hi,
This bug:
http://bugs.php.net/bug.php?id=46680
uncovers 2 larger issues.
1) Where should a function like file_put_contents() create its file if
it doesn't already exist and FILE_USE_INCLUDE_PATH is specified? The
test for this is ext/standard/file/file_put_contents_variation4.phpt and
a few others.
file_put_contents($filename, "File in include path", FILE_USE_INCLUDE_PATH);
arbitrarily creates $filename in the first portion of include_path on
PHP 5.2, and arbitrarily creates $filename in cwd in PHP 5.3. Of
course, if the file already exists in any of the include_path, both PHP
5.2 and 5.3 will overwrite it.
The same is true of fopen() in write mode.
2) Should file_get_contents()/fopen() in read mode fall back to current
directory if not found in include_path? The test for this is
ext/standard/file/fopen_variation5.phpt and others
In PHP 5.2, the functions simply fail if the file does not exist in
include_path. Thus if include_path does not contain ".", the file is
not found. In PHP 5.3, there is a fallback to check cwd for the file.
For #1 I think both PHP 5.2 and 5.3 are broken. If you specify that a
file should be written to inside include_path, it should fail if no file
is found - allowing arbitrary file creation is just plain stupid and
also dangerous - include_path has no business being used to create a
file, it should only be used to find existing files. In any case, I
think allowing include_path to be used at all for file modification is
horrendous, and think it should be deprecated and removed from PHP 6.
We should simply add file_resolve_path() function which can be used to
locate a file.
<?php
if ($path = file_resolve_path('somefile.txt')) {
file_put_contents($path, 'blah');
} else {
file_put_contents($someOtherPath, 'blah');
}
?>
For #2 I think PHP 5.3 is broken, and the fallback to cwd should be
removed from php_resolve_path.
Comments?
Greg
P.S. the tests themselves should not create directories outside of their
tests/ subdirectory, and should use things like PATH_SEPARATOR, but
that's a minor issue