Za normálních okolností se toho při ukončení skriptu moc neděje – zavolají se interní funkce ukončující PHP moduly, které po sobě uklidí (např. zavřou soubory nebo ukončí připojení do databáze). Při použití objektů se kromě toho v PHP 5 volají destruktory, je možné vytvořit funkci volanou při ukončení, v určitý okamžik je také nutné zapsat session proměnné a ukončit bufferování výstupu. Začíná se to poněkud zesložiťovat, pořadí provedení těchto akcí navíc ve starších verzích procházelo určitým vývojem. V PHP 5.1.1 dospělo do tohoto pořadí:
Pořadí provedení lze otestovat následujícím skriptem:
<?php class A { function __destruct() { $_SESSION["destruct"] = true; echo "destruct\n"; } } function shutdown_function() { $_SESSION["shutdown_function"] = true; echo "shutdown_function\n"; } function ob_function($buffer, $mode) { $_SESSION["ob_function"] = true; return $buffer . ($mode & PHP_OUTPUT_HANDLER_END ? "ob_end\n" : ""); } session_start(); print_r($_SESSION); $fp = fopen("test", "wb"); ob_start("ob_function"); $a = new A(); register_shutdown_function('shutdown_function'); ?>
Zajímavý problém nastává při společném použití destruktorů objektů a session proměnných. Pochopitelný požadavek je, aby si destruktor mohl do session proměnné ještě něco zapsat, proto v PHP 5.0.5 bylo pořadí takto upraveno. Pokud si však napíšeme vlastní objekt pro obsluhu session proměnných, tak naopak potřebujeme, aby byl zrušen až po zápisu. Vyřešit se to dá tak, že v destruktoru tohoto objektu se zavolá funkce session_write_close. Stejný problém nastává i při použití objektů jako MySQLi i v běžné funkci.
Diskuse je zrušena z důvodu spamu.