ID: 31570 Comment by: inspiretheweb at googlemail dot com Reported By: twadzilla at gmail dot com Status: No Feedback Bug Type: Scripting Engine problem Operating System: Redhat 9 PHP Version: 5CVS-2005-01-16 New Comment:
This problem still exists in PHP 5.2.5 (Mac OS X, Apache 2.2), and is quite a nuisance to be honest. It seems to be due to the fact that the current working directory changes to '/' before object-destructors are called (at least under Apache). Although this is noted at http://php.net/manual/en/language.oop5.decon.php, I think that object destructors should be called before any changes are made to the current working directory. For developers who are unaware of this behavior, it is going to be quite difficult for them to debug the issue in their application. If for any reason this behavior is not going to change, it should at least be displayed as a warning in the PHP manual, rather than a small notice. Previous Comments: ------------------------------------------------------------------------ [2006-05-25 01:19:58] paul at stunning-stuff dot com Hi, I'm using PHP 5.1.4 and this bug still exists. Including or requiring a file in the destructor using a relative path spits out an error. It seems to me that any user-made code, including destructors should always be called before PHP cleans up anything. Thanks, Paul ------------------------------------------------------------------------ [2005-05-02 01:00:05] php-bugs at lists dot php dot net No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2005-04-24 16:50:45] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php5-latest.tar.gz For Windows: http://snaps.php.net/win32/php5-win32-latest.zip ------------------------------------------------------------------------ [2005-01-19 08:42:12] twadzilla at gmail dot com The line in foo.php: $absolute = "/home/test/www/$abs"; should be: $absolute = "/home/test/www/$relative"; ------------------------------------------------------------------------ [2005-01-16 14:43:11] twadzilla at gmail dot com Description: ------------ PHP generates a warning inside a class destructor when you try to read a file, because apparently it cannot resolve relative paths by the time when the destructor is called for referenced objects. When the open_basedir config is commented out, only the "include" directive resolves the relative path; the other file-reading methods fail. When open_basedir is in effect, it causes all the methods to fail, including the "include" directive. The following issue is demonstrated at: http://test.kneetoe.com/foo.php http://test.kneetoe.com/foo.php.txt (alternatively with more checks): http://test.kneetoe.com/foo2.php http://test.kneetoe.com/foo2.php.txt I recommend that class destructors get executed before the ability to resolve relative paths gets unloaded. http://test.kneetoe.com/phpinfo.php Reproduce code: --------------- [httpd.conf]: php_admin_value open_basedir /home/test/www [/home/test/www/bar.html]: Bar! [/home/test/www/foo.php]: class Foo { function __destruct() { $relative = 'bar.html'; $absolute = "/home/test/www/$abs"; echo "Absolute 'include': "; include $absolute; echo "Relative 'include': "; include $relative; echo "Absolute 'readfile': "; readfile($absolute); echo "Relative 'readfile': "; readfile($relative); } } print "<h2>Non-referenced (immediate destruction):</h2>"; new Foo; print "<h2>Referenced (delayed destruction):</h2>"; $a = new Foo; Expected result: ---------------- Non-referenced (immediate destruction): Absolute 'include': Bar! Relative 'include': Bar! Absolute 'readfile': Bar! Relative 'readfile': Bar! Referenced (delayed destruction): Absolute 'include': Bar! Relative 'include': Bar! Absolute 'readfile': Bar! Relative 'readfile': Bar! Actual result: -------------- [[[open_basedir commented out]]]: Non-referenced (immediate destruction): Absolute 'include': Bar! Relative 'include': Bar! Absolute 'readfile': Bar! Relative 'readfile': Bar! Referenced (delayed destruction): Absolute 'include': Bar! Relative 'include': Bar! Absolute 'readfile': Bar! Relative 'readfile': Warning: readfile(bar.html) [function.readfile]: failed to open stream: No such file or directory in /home/test/www/foo.php on line 19 [[[open_basedir in effect]]]: Non-referenced (immediate destruction): Absolute 'include': Bar! Relative 'include': Bar! Absolute 'readfile': Bar! Relative 'readfile': Bar! Referenced (delayed destruction): Absolute 'include': Bar! Relative 'include': Warning: Foo::__destruct() [function.--destruct]: open_basedir restriction in effect. File(./bar.html) is not within the allowed path(s): (/home/test/www) in /home/test/www/foo.php on line 13 Warning: Foo::__destruct(bar.html) [function.--destruct]: failed to open stream: Operation not permitted in /home/test/www/foo.php on line 13 Warning: Foo::__destruct() [function.include]: Failed opening 'bar.html' for inclusion (include_path='.:/usr/local/lib/php') in /home/test/www/foo.php on line 13 Absolute 'readfile': Bar! Relative 'readfile': Warning: readfile() [function.readfile]: open_basedir restriction in effect. File(bar.html) is not within the allowed path(s): (/home/test/www) in /home/test/www/foo.php on line 19 Warning: readfile(bar.html) [function.readfile]: failed to open stream: Operation not permitted in /home/test/www/foo.php on line 19 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=31570&edit=1