|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2011-01-23 21:27 UTC] jani@php.net
-Package: Feature/Change Request
+Package: Session related
-PHP Version: 5.2.6
+PHP Version: *
[2013-06-27 11:00 UTC] yohgaki@php.net
-Status: Open
+Status: Analyzed
-Package: Session related
+Package: Scripting Engine problem
[2013-06-27 11:00 UTC] yohgaki@php.net
[2020-11-16 16:24 UTC] cmb@php.net
-Package: Scripting Engine problem
+Package: Session related
[2020-11-16 16:24 UTC] cmb@php.net
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 12:00:02 2025 UTC |
Description: ------------ If a PHP object is stored into the PHP session, __destruct() is called before __sleep(). One way to fix this bug is to change the evaluator to call session_write_close() before calling __destruct(). Reproduce code: --------------- <?php /** * Check if __destruct() is called after __sleep() * exit with 1 if the test failed. */ class C { var $destroyed = false; function __destruct() { echo "destroy called\n"; $this->destroyed = true; } function __sleep() { if ($this->destroyed) {echo("sleep failed. bleh!\n"); exit(1); } return array(); } function __wakeup() { $this->destroyed = false; } function __toString() { return "C::".($this->destroyed?"destroyed":"active"); } } session_id("session-write-close-bug"); session_start(); $a=@$_SESSION['a']; if(!$a) { echo "new C\n"; $a=new C(); $_SESSION['a']=$a; } $a=$_SESSION['a']; echo "$a\n"; //session_write_close(); exit (0); ?> Expected result: ---------------- result code 0 Actual result: -------------- result code 1