ID: 30957
User updated by: rueycheng at gmail dot com
-Summary: filesystem functions and object destructor
Reported By: rueycheng at gmail dot com
Status: Open
Bug Type: Class/Object related
Operating System: Windows XP
PHP Version: 5.0.1
New Comment:
The garbage collector may clean up the object prior to its __destruct()
invocation. Nothing would go wrong if you explicitly *destroy* the
object.
By the way, I tested the code on Redhat 7.3 with the following
configuration.
$ cat config.nice
#! /bin/sh
#
# Created by configure
'./configure' \
'--with-apxs=/usr/local/apache/bin/apxs' \
'--with-mysql=/usr/local/mysql/' \
'--with-libxml-dir' \
'--enable-dba' \
'--enable-mbstring' \
"$@"
$ diff php.ini ../src/php-5.0.1/php.ini-recommended
353c353
< display_errors = On
---
> display_errors = Off
407c407
< ;error_log = /var/log/php.log
---
> ;error_log = filename
491c491
< include_path = ".:/usr/local/lib/php"
---
> ;include_path = ".:/php/includes"
As a result, two warnings are generated.
[
Warning: file_put_contents(./.bugtest) [function.file-put-contents]:
failed to open stream: Permission denied in
/home/httpd/html/testbed/bugtest.php on line 12
Warning: file_get_contents(./.bugtest) [function.file-get-contents]:
failed to open stream: No such file or directory in
/home/httpd/html/testbed/bugtest.php on line 13
]
Actually I've already enabled the write-permission for the directory.
The execution of these filesystem functions outside of __destruct() is
OK.
Previous Comments:
------------------------------------------------------------------------
[2004-12-02 11:01:33] rueycheng at gmail dot com
Description:
------------
Some filesystem functions, like file_put_contents() or fwrite(), don't
work properly in the destructor __destruct(). The following scenario
may looks a bit weird: it appeared that the file is not overwritten or
even created, but PHP does 'read' the content of the imaginary file!
If you uncomment the last line of the code, everything would works
fine.
Thanks.
$ diff php.ini php.ini-dist
288c288
< error_reporting = E_ALL
---
> error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT
436c436
< include_path = ".;c:\php-5.0.1\PEAR"
---
> ;include_path = ".;c:\php\includes"
450c450
< extension_dir = "c:\php-5.0.1\ext"
---
> extension_dir = "./"
571,573c571,573
< extension=php_mbstring.dll
< extension=php_mcrypt.dll
< extension=php_mhash.dll
---
> ;extension=php_mbstring.dll
> ;extension=php_mcrypt.dll
> ;extension=php_mhash.dll
578c578
< extension=php_mysql.dll
---
> ;extension=php_mysql.dll
Reproduce code:
---------------
<?
class Bug
{
private $filename;
public function __construct($filename) {
$this->filename = $filename;
}
public function __destruct() {
echo "[";
file_put_contents($this->filename, 'Gotcha!');
echo file_get_contents($this->filename);
echo "]";
}
}
$bug = new Bug('.bugtest');
//unset($bug);
?>
Expected result:
----------------
[Gotcha!]
(And the file .bugtest under working directory should be created.)
$ cat .bugtest
Gotcha!
Actual result:
--------------
[Gotcha!]
$ cat .bugtest
cat: .bugtest: No such file or directory
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=30957&edit=1