summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-12-10 22:08:36 +0000
committerBrion Vibber <brion@pobox.com>2010-12-10 14:12:02 -0800
commit3f9b8b293d5071357771ce7a88ffaf530ce229e8 (patch)
treef6cad6a76dd2bab4c3631b385e6c32c63d21f517
parent65f2d12bbf382d65cb525d3885e4bbd2a02c515c (diff)
Workaround for locally-handled sessions breaking on PHP 5.3 with APC enabled.
Big thanks to the folks at http://pecl.php.net/bugs/bug.php?id=16745 for the secret juju! Classes were being torn down before session save handlers got called at the end of the request, which exploded with complaints about being unable to find various classes. Registering a shutdown function lets us explicitly close out the session before everything gets torn down.
-rw-r--r--classes/Session.php12
1 files changed, 12 insertions, 0 deletions
diff --git a/classes/Session.php b/classes/Session.php
index 2422f8b68..e1c83ad4d 100644
--- a/classes/Session.php
+++ b/classes/Session.php
@@ -178,6 +178,18 @@ class Session extends Memcached_DataObject
$result = session_set_save_handler('Session::open', 'Session::close', 'Session::read',
'Session::write', 'Session::destroy', 'Session::gc');
self::logdeb("save handlers result = $result");
+
+ // PHP 5.3 with APC ends up destroying a bunch of object stuff before the session
+ // save handlers get called on request teardown.
+ // Registering an explicit shutdown function should take care of this before
+ // everything breaks on us.
+ register_shutdown_function('Session::cleanup');
+
return $result;
}
+
+ static function cleanup()
+ {
+ session_write_close();
+ }
}