#30957 [Opn]: filesystem functions bugs in destructor (under gc condition)

From: Date: Thu, 02 Dec 2004 10:25:10 +0000
Subject: #30957 [Opn]: filesystem functions bugs in destructor (under gc condition)
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-69719@lists.php.net to get a copy of this message
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

« previous php.bugs (#69719) next »