I needed to figure out in what order PHP shuts down, after the end of a script has been reached, so I created a small testing script. Maybe this is of use for someone else trying to google this like I tried.
- <?php
- // Testing shutdown sequence
- function shutdown() {
- echo "register_shutdown_function\n";
- }
- register_shutdown_function('shutdown');
- class MyClass {
- function __destruct() {
- echo "Object destructor\n";
- }
- }
- function obcallback($buffer) {
- $buffer .= "Output buffer callback\n";
- return $buffer;
- }
- ob_start('obcallback');
- $myObject = new MyClass;
- function dummy() { }
- function sessionclose() {
- echo "Session close\n";
- }
- function sessionwrite() {
- echo "Session write\n";
- }
- session_set_save_handler('dummy','sessionclose','dummy','sessionwrite','dummy','dummy');
- session_start();
- ?>
The output, on PHP 5.2.0 on the cli is:
- register_shutdown_function
- Object destructor
- Output buffer callback
- Session write
- Session close
I was mostly interested in this because I wanted to work with a custom session handler. This means I can basically not use objects in combination with session handlers, unless I don't rely on $this.

Yes you can, you need to register session_close in your register_shutdown_function
Or
register_shutdown_function("session_write_close");
This closes the session up prior to the objects being destroyed
Thats smart!
That part of the PHP code is een good commented, so you can et the real order without much internals&C knowledge: http://lxr.php.net/source/php-src/main/main.c#1546
That is pretty cool.. looks like I haven't really missed anything =)
I always love investigative PHPing. Good work and very useful!
I think it is a tip of the day :)