pcntl_signal

シグナルハンドラを設定する

説明

bool pcntl_signal(int $signal, callableint $handler, bool $restart_syscalls = true)

pcntl_signal 関数は、signal が指すシグナルに関するハンドラを新たに設定するか、既存のハンドラを置き換えます。

パラメータ

signal

シグナル番号。

handler

シグナルハンドラ。callable を渡すと、それを実行してシグナルを処理します。 あるいは、グローバル定数 SIG_IGN または SIG_DFL を渡すこともできます。それぞれ、シグナルを無視することとデフォルトのシグナルハンドラを復活させることを表します。

callable を渡す場合は、次のシグネチャを実装したものでなければいけません。

void handler(int $signo, mixed $siginfo)
signal
処理するシグナル。
siginfo
OS が siginfo_t 構造体をサポートしている場合、 これはシグナルに依存するシグナル情報の配列になります。

注意:

オブジェクトのメソッドをハンドラとして指定した場合には、 そのハンドラを別のものに変えたりスクリプトが終了したりするまでは オブジェクトのリファレンスカウントが増加したままであることに注意しましょう。

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 は、既存のシグナルハンドラがある場合にはそれを上書きします。

参考

  • pcntl_fork
  • pcntl_waitpid