(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — シグナルハンドラを設定する
pcntl_signal() 関数は、signal
が指すシグナルに関するハンドラを新たに設定するか、既存のハンドラを置き換えます。
signal
シグナル番号。
handler
シグナルハンドラ。callable を渡すと、それを実行してシグナルを処理します。
あるいは、グローバル定数 SIG_IGN
または SIG_DFL
を渡すこともできます。それぞれ、シグナルを無視することとデフォルトのシグナルハンドラを復活させることを表します。
callable を渡す場合は、次のシグネチャを実装したものでなければいけません。
signal
siginfo
注意:
オブジェクトのメソッドをハンドラとして指定した場合には、 そのハンドラを別のものに変えたりスクリプトが終了したりするまでは オブジェクトのリファレンスカウントが増加しないことに注意しましょう。
restart_syscalls
再起動のシステムコールに対応するかどうかを設定します。
成功した場合に true
を、失敗した場合に false
を返します。
バージョン | 説明 |
---|---|
7.1.0 | PHP 7.1.0 以降、 ハンドラコールバックは特定のシグナルの siginfo を含む 2 番目の引数を受け付けるようになりました。 このデータは、OS が siginfo_t 構造体を持つ場合のみ提供されます。 OS が siginfo_t を実装していない場合は NULL が提供されます。 |
例1 pcntl_signal() の例
<?php
// tick を使用しなければなりません
declare(ticks = 1);
// シグナルハンドラ関数
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// シャットダウンの処理
exit;
break;
case SIGHUP:
// 再起動の処理
break;
case SIGUSR1:
echo "SIGUSR1 を受け取りました...\n";
break;
default:
// それ以外のシグナルの処理
}
}
echo "シグナルハンドラを設定します...\n";
// シグナルハンドラを設定します
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// あるいは、オブジェクトも指定できます
// pcntl_signal(SIGUSR1, array($obj, "do_something"));
echo "自分自身に SIGUSR1 シグナルを送信します...\n";
// SIGUSR1 をカレントのプロセス ID に送信します
// posix_* 関数を使うには posix 拡張モジュールが必要です
posix_kill(posix_getpid(), SIGUSR1);
echo "終了\n";
?>
pcntl_signal() は、既存のシグナルハンドラがある場合にはそれを上書きします。