はじめに
PHP スクリプト終了時に実行される「シャットダウン関数」は、register_shutdown_function() によって登録できます。
複数回登録した場合の呼び出し順序や、関数内で exit() を呼んだときの挙動は、試験でもよく問われるポイントです。
この記事では、実際のコード例とともに実行順序の仕組みをわかりやすく整理します。
目次
🧩 register_shutdown_function() とは?
register_shutdown_function() は、スクリプト終了時に自動的に呼び出される関数を登録する仕組みです。
構文は以下の通りです。
register_shutdown_function(callable $callback, mixed ...$args): void💬 ポイント
- 関数を「複数回」登録できる
- 「登録した順」に実行される
- 登録された関数の中で
exit()を呼ぶと、それ以降の関数は呼ばれない
💻 実行例
<?php
declare(strict_types=1);
error_reporting(-1);
echo "start \n";
register_shutdown_function(function(){
echo "shutdown func 1st\n";
});
register_shutdown_function(function(int $num){
echo "shutdown func 2nd({{$num})\n";
}, 123);
register_shutdown_function(function(){
echo "shutdown func 3rd\n";
exit; // ← ここで処理が終了する
});
register_shutdown_function(function(){
echo "shutdown func 4th\n";
});
exit;
echo "end \n";🧮 実行結果
start
shutdown func 1st
shutdown func 2nd({123)
shutdown func 3rd🔍 実行の流れを解説
1️⃣ “start” が出力される。
→ スクリプトが exit; に到達。
2️⃣ スクリプト終了時に、登録済みの shutdown 関数が「登録順」に実行される。
| 登録順 | 関数内容 | 実行される? | 備考 |
|---|---|---|---|
| 1st | メッセージ出力 | ✅ | 実行される |
| 2nd | 引数 123 を受け取り出力 | ✅ | 実行される |
| 3rd | メッセージ出力+exit | ✅ | ここでスクリプト終了 |
| 4th | メッセージ出力 | ❌ | 実行されない |
🧭 exit の影響を図で理解する
┌────────────────────────────┐
│ register_shutdown_function │
└────────────┬───────────────┘
│
▼
┌───────────────────────┐
│ shutdown func 1st │ ← 実行
├───────────────────────┤
│ shutdown func 2nd │ ← 実行
├───────────────────────┤
│ shutdown func 3rd │ ← 実行(exit発生!)
├───────────────────────┤
│ shutdown func 4th │ ← 実行されない
└───────────────────────┘exit によって「残りのシャットダウン関数」はキャンセルされる点が試験の要注意ポイントです。
💡補足:exitを削除すると…
register_shutdown_function(function(){
echo "shutdown func 3rd\n";
// exit; ← 削除
});出力は次のように変わります👇
start
shutdown func 1st
shutdown func 2nd({123)
shutdown func 3rd
shutdown func 4th✅ まとめ
| 項目 | 内容 |
|---|---|
| 複数登録 | register_shutdown_function() は何度でも呼べる |
| 実行順序 | 登録順 に実行される |
| exitの影響 | exit()を呼ぶと以降のshutdown関数は呼ばれない |
| 試験での注意点 | 呼び出し順とexitの停止位置を意識すること |
