【PHP8.x】register_shutdown_function関数の使い方

作成日: 更新日:

register_shutdown_function関数は、PHPスクリプトの実行が終了する直前に、特定の処理を実行するために登録する関数です。この関数は、スクリプトが正常に完了した場合だけでなく、致命的なエラー(Fatal Error)が発生したり、exit()die()関数によって途中で終了した場合でも、必ず登録された処理を実行します。

利用するには、実行したい処理を記述した関数、つまり「コールバック関数」を指定してこの関数を呼び出します。そうすることで、指定されたコールバック関数が、PHPスクリプトのライフサイクルの最終段階で自動的に実行されるようになります。

たとえば、スクリプトが生成した一時ファイルのクリーンアップ、開いたデータベース接続の確実なクローズ、処理の完了を知らせるログの記録など、どのような状況でも必ず実行しておきたい後処理に非常に有用です。これにより、予期せぬスクリプト終了時でもリソースの解放やデータの整合性確保といった重要な処理を忘れずに実行でき、アプリケーションの安定性と信頼性を高めることができます。PHP 8の環境においても、この機能は開発者が堅牢なアプリケーションを構築する上で引き続き重要な役割を果たします。

基本的な使い方

構文(syntax)

<?php
register_shutdown_function('callable_function_name', $argument1, $argument2);
?>

引数(parameters)

callable $callback, mixed ...$args

  • callable $callback: スクリプト終了時に実行されるコールバック関数またはメソッドを指定します。
  • mixed ...$args: コールバック関数に渡される引数を可変長で指定します。

戻り値(return)

void

register_shutdown_function関数は、スクリプトの実行が終了する際に呼び出されるコールバック関数を登録します。この関数は、登録されたコールバック関数が実行された後に、スクリプトの終了処理を行います。戻り値はありません。

サンプルコード

PHPでクラスメソッドをシャットダウン関数に登録する

<?php

declare(strict_types=1);

/**
 * スクリプトの終了を管理するクラス
 * 
 * このクラスのインスタンスメソッドをシャットダウン関数として登録する例です。
 */
class ShutdownManager
{
    /**
     * @var string 処理を実行したユーザー名
     */
    private string $user;

    /**
     * コンストラクタ
     *
     * @param string $user 処理を実行したユーザー名
     */
    public function __construct(string $user)
    {
        $this->user = $user;
        echo "ShutdownManagerがユーザー '{$this->user}' で初期化されました。" . PHP_EOL;
    }

    /**
     * スクリプト終了時に呼び出されるメソッド (シャットダウンハンドラ)
     *
     * このメソッドは public である必要があります。
     * @param string $exitMessage 終了メッセージ
     */
    public function handleShutdown(string $exitMessage): void
    {
        // 実際のアプリケーションでは、ここでリソースの解放やログの記録などを行います。
        $timestamp = date('Y-m-d H:i:s');
        echo PHP_EOL . "--- シャットダウン処理開始 ---" . PHP_EOL;
        echo "時刻: {$timestamp}" . PHP_EOL;
        echo "ユーザー: {$this->user}" . PHP_EOL;
        echo "終了メッセージ: {$exitMessage}" . PHP_EOL;
        echo "--- シャットダウン処理終了 ---" . PHP_EOL;
    }
}

// 1. クラスのインスタンスを生成します。
//    コンストラクタで初期化された状態(ここでは $user)は、インスタンス内で保持されます。
$manager = new ShutdownManager('admin');

// 2. register_shutdown_function() を使って、インスタンスのメソッドを登録します。
//    第一引数に [インスタンス, 'メソッド名'] の形式で指定します。
//    第二引数以降は、登録したメソッドに渡される引数です。
register_shutdown_function([$manager, 'handleShutdown'], '処理が正常に完了しました。');

echo "メインの処理を実行しています..." . PHP_EOL;
echo "メインの処理が完了しました。" . PHP_EOL;

// このスクリプトが終了すると、登録された $manager->handleShutdown() が自動的に呼び出されます。
// その際、コンストラクタで設定したプロパティ($user)も利用できます。

このサンプルコードは、PHPのregister_shutdown_function関数を使い、クラスのインスタンスメソッドをスクリプト終了時に実行する方法を示しています。この関数は、スクリプトの実行が正常に終了した場合や、エラーで中断した場合など、処理が終了する際に必ず呼び出される関数を「予約」する機能を持っています。この関数自体は何も値を返しません(戻り値はvoidです)。

コードでは、まずShutdownManagerクラスのインスタンスを$managerという変数に作成しています。コンストラクタで渡されたユーザー名'admin'は、このインスタンスの内部に保存されます。 次にregister_shutdown_functionを呼び出しています。第一引数には、終了時に呼び出すコールバック関数を指定します。インスタンスメソッドを渡す場合は、[$manager, 'handleShutdown']のように、インスタンス変数とメソッド名を配列で指定します。第二引数以降は、そのメソッドに渡す引数を指定します。この例では、'処理が正常に完了しました。'という文字列がhandleShutdownメソッドの引数として渡されます。 メインの処理がすべて完了し、スクリプトが終了する直前のタイミングで、登録された$managerhandleShutdownメソッドが自動的に実行されます。このとき、インスタンスが保持しているプロパティ($user)も利用できるため、状態を維持したままリソースの解放やログ出力といった終了処理を安全に行うことができます。

クラスのインスタンスメソッドをシャットダウン関数として登録する場合、第一引数は[$インスタンス変数, 'メソッド名']という配列形式で指定します。このメソッドは、外部から呼び出せるようpublicでなければなりません。register_shutdown_functionの第二引数以降は、登録したメソッドに渡す引数となります。この関数は、スクリプトが正常終了した時だけでなく、exit()の呼び出しや致命的なエラー発生時にも実行されるため、リソース解放や最終的なログ記録に適しています。登録したインスタンスはシャットダウン処理が完了するまで維持されるため、メソッド内ではプロパティにアクセスできます。

【PHP8.x】register_shutdown_function関数の使い方 | いっしー@Webエンジニア