Co se děje při ukončení skriptu

Školení, která pořádám

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í:

  1. vložení připojeného souboru
  2. zavolání ukončovacích funkcí
  3. zavolání destruktorů
  4. zapsání session proměnných
  5. 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.

Jakub Vrána, Výuka, 20.3.2006, diskuse: 0 (nové: 0)

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.