Co se děje při ukončení skriptu
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í:
- vložení připojeného souboru
- zavolání ukončovacích funkcí
- zavolání destruktorů
- zapsání session proměnných
- ukončení bufferování, zavření souborů, ukončení připojení do databáze
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.

