register_shutdown_function
register_shutdown_function($callback, ...$args)
Rejestruje funkcję, która wykona się po zakończeniu skryptu – po ostatnim wierszu, po exit, po błędzie krytycznym i po nieprzechwyconym wyjątku.
Parametry
- $callback – funkcja do wykonania.
- $args – opcjonalny, wartości, które funkcja dostanie przy wykonaniu.
Przykłady
// zapis błędów krytycznych, których set_error_handler() nie przechwyci
function check_on_shutdown() {
$error = error_get_last();
if ($error !== null && in_array($error["type"], array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR), true)) {
error_log("Błąd krytyczny: " . $error["message"] . " w " . $error["file"] . ":" . $error["line"]);
}
}
register_shutdown_function("check_on_shutdown");
// funkcja z argumentem – czas działania skryptu
function run_time($start) {
$seconds = microtime(true) - $start;
if ($seconds > 5) {
error_log("Wolna strona: " . round($seconds, 1) . " s");
}
}
register_shutdown_function("run_time", microtime(true));
// funkcja wykona się także po exit
// exit;
Na co uważać
- Funkcje wykonują się w kolejności rejestracji. Jeśli któraś wywoła exit, następne już się nie wykonają.
- Katalog roboczy może być przy wykonaniu inny (na przykład pod Apache). W ścieżkach używaj __DIR__.
- Wyjście z funkcji jeszcze trafi do przeglądarki, ale nagłówki mogą być już wysłane.
- Przy błędzie „Allowed memory size exhausted” funkcji zostaje niewiele pamięci. Pisz ją oszczędnie.
- Żeby naprawdę zakończyć żądanie przed długą pracą w tle, pod PHP-FPM służy fastcgi_finish_request().
Powiązane funkcje:
set_error_handler()
set_exception_handler()
error_log()
microtime()