ID: 31570 Comment by: paul at stunning-stuff 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:
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 Previous Comments: ------------------------------------------------------------------------ [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