| Bug #33772 | __destruct is run too early (session_save_handler) | ||||
|---|---|---|---|---|---|
| Submitted: | 19 Jul 2005 4:47pm UTC | Modified: | 20 Sep 2005 3:17pm UTC | ||
| From: | msipria at suomi24 dot fi | Assigned to: | |||
| Status: | Closed | Category: | Documentation problem | ||
| Version: | 5CVS-2005-07-19 | OS: | * | ||
| Votes: | 22 | Avg. Score: | 4.8 ± 0.6 | Reproduced: | 22 of 22 (100.0%) |
| Same Version: | 10 (45.5%) | Same OS: | 10 (45.5%) | ||
[19 Jul 2005 4:47pm UTC] msipria at suomi24 dot fi
[19 Jul 2005 9:20pm UTC] sniper@php.net
I need this fixed too, it's not possible to use e.g. mysqli as save handler otherwise..
[21 Jul 2005 12:10am UTC] toma at smartsemantics dot com
Adding session_write_close() to the __destruct() function will restore
the write, close, and destroy functions to their proper order.
I use a custom session handler that extends my custom mysqli class. It
automatically checks for lost database connections and attempts
reconnects, etc.
This is still a bug, but the following makes your custom session handler
viable.
public function __destruct(){
@session_write_close();
}
Without session_write_close:
starting session
connecting to database
destroying session
writing session
can't write, database connection does not exist
connecting to database
writing session
closing session
With session_write_close:
starting session
connecting to database
writing session
closing session
destroying session
[21 Jul 2005 4:38pm UTC] msipria at suomi24 dot fi
my class isn't extension of mysqli class, it just use it as object, and with real class i have tryed session_write_close() function but mysql connection is deat, i don't wanna restor it, i just wanna that it will be alive at the end like now.
[9 Aug 2005 2:01pm UTC] dmitry@php.net
This is chicken/egg problem and it cannot be solved. One expect that destructors are called before session close the other uses object for save handlers.
[9 Aug 2005 2:55pm UTC] sniper@php.net
This patch fixes this problem by doing php_session_flush() before any __destruct()'s are called: http://www.php.net/~jani/patches/bug33772.patch Note: It won't work if you have compiled ext/session as shared. We need a better solution, I'm submitting this just as as temporary one.
[23 Aug 2005 3:03am UTC] sniper@php.net
Reclassified as documentation issue.
[24 Aug 2005 11:58pm UTC] webmaster at vintagegaming dot org
I want to enter this as a new bug report but I expect it would be kicked
out as a duplicate of 33635, which links to this bug. This seems
related in that something has changed so that my mysqli link is closed
before the shutdown_function is executed.
The following code works in all php5 versions before 5.1beta3.
<?php
function shutdown()
{
global $link;
echo mysqli_real_escape_string($link, 'foo');
}
$servername = 'localhost';
$username = 'username';
$password = 'password';
$link = mysqli_init();
mysqli_real_connect($link, $servername, $username, $password);
echo mysqli_real_escape_string($link, 'foo') . '<br />';
register_shutdown_function('shutdown');
?>
Expected Result:
foo
foo
Actual Result:
foo
Warning: Couldn't fetch mysqli in c:\program files\apache
group\Apache\htdocs\foo.php on line 7
and to further this annoying issue, why is it that the equivalent mysql
function still works in 5.1b3?
<?php
function shutdown()
{
global $link;
echo mysql_real_escape_string('foo', $link);
}
$servername = 'localhost';
$username = 'username';
$password = 'password';
$link = mysql_connect($servername, $username, $password);
echo mysql_real_escape_string('foo', $link) . '<br />';
register_shutdown_function('shutdown');
?>
Expected Result:
foo
foo
Actual Result:
foo
foo
[9 Sep 2005 9:56pm UTC] tss24 at cornell dot edu
Experiencing the same exact problem with PHP 5.0.5 and MySQL 4.1.11 Was this a new bug with PHP 5.0.5 / 5.1.x?
[9 Sep 2005 10:01pm UTC] earnest dot berry at gmail dot com
I also am having the issue. I'm using 5.1.0b3 with mysql 4.1.13a-nt. Will this be fixed in the next relase of PHP?
[10 Sep 2005 12:34pm UTC] zulan at zulan dot net
If this is the egg, the chicken is: http://bugs.php.net/bug.php?id=27555 Is there a way to make it ini_set-able if objects->__destruct or sess_write_close first?
[20 Sep 2005 3:17pm UTC] vrana@php.net
This bug has been fixed in the documentation's XML sources. Since the online and downloadable versions of the documentation need some time to get updated, we would like to ask you to be a bit patient. Thank you for the report, and for helping us make our documentation better. "Write and Close handlers are called after destructing objects since PHP 5.0.5. Thus destructors can use sessions but session handler can't use objects. In prior versions, they were called in the opposite order. It is possible to call session_write_close() from the destructor to solve this chicken and egg problem."
