ID: 34430 Updated by: [EMAIL PROTECTED] Reported By: jpleveille at unimasoft dot com -Status: Open +Status: Bogus Bug Type: Session related Operating System: Windows XP SP2 PHP Version: 5.0.5 New Comment:
Call session_write_close() in the object's __destruct() Previous Comments: ------------------------------------------------------------------------ [2005-09-08 17:19:07] jpleveille at unimasoft dot com In the example, you must read $db = DB::connect('mysqli://user:[EMAIL PROTECTED]/db'); and not $db = PEAR::connect('mysqli://user:[EMAIL PROTECTED]/db'); Sorry for this little mistake. ------------------------------------------------------------------------ [2005-09-08 17:17:30] jpleveille at unimasoft dot com Description: ------------ If this is a not a bug, sorry. But I think the behaviors of script execution and object destruction changed in PHP 5.0.5 without notice. I created a session handler which uses a database object to query a MySQL DB to load/save sessions. The object is a PEAR::DB instance created with mysqli factory; the session handler is a simple object with methods being passed to session_set_save_handler(). The session object has a reference to the database object to query the database. A problem started to occur when upgrading from PHP 5.0.4 to PHP 5.0.5 on both Windows (XP SP2) and Linux. On Linux, it is not possible to close a session using my own session handler because the database object is already destroyed (read disconnected - the object was still there but not connected - I suspect the use of OO interface of mysqli in PEAR::DB). On Windows, this issue occurs only when functions die() or exit() are used. Additionally, with E_ALL, I have the following error message: Unknown: A session is active. You cannot change the session module's ini settings at this time. in Unknown on line 0 Reproduce code: --------------- My session handler: class DB_Session { private $db; // instance of PEAR::DB(mysqli) public __construct($db) { $this->db = $db; } public open($save_path, $session_name); // to open session public close(); // to close session public read($id); // to read the session data public write($id, $sess_data); // to write session data public destroy($id); // to delete the session in DB public gc($maxlifetime); // my garbage collector public start() // to start the session { ini_set('session.hash_bits_per_character', 5); ini_set('session.hash_function', 1); // SHA1 session_set_save_handler( array($this, "open"), array($this, "close"), array($this, "read"), array($this, "write"), array($this, "destroy"), array($this, "gc") ); session_start(); } } $db = PEAR::connect('mysqli://user:[EMAIL PROTECTED]/db'); $session = new DB_Session($db); // on Linux, $session->write() raises an error (PEAR::DB // object disconnected) // this error occurs in Windows when die() or exit is called Expected result: ---------------- In PHP 5.0.4, the database object is still connected when the session handler is called to write the session data. I expected the same behavior in PHP 5.0.5, i.e.: - database object is created - session object is created, database object passed to constructor - session is read (ok) - script execution ends, session is written (ok) - session is closed (does nothing, db object might be used elsewhere) Actual result: -------------- The script executes correctly, but the session isn't saved because method write() fails to query database to record new session data. I have the following behavior: - database object is created - session object is created, database object passed to constructor - session is read (ok) - script execution ends, session is written (failed - db object disconnected!) Note that I encountered this error in Windows ONLY when calling exit() or die(). I encountered this issue in every PHP script execution using the custom session handler on Linux (debian sarge). I know my database object may be destroyed BEFORE my session object, but it doesn't seem to be the case because I can still access its methods. I think it has something to do with the mysqli object (returned by mysqli_connect()) but I'm not sure (I also noticed PEAR::DB(mysqli) isn't handling the persistent option). ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=34430&edit=1