CXII. プロセス制御関数

導入

PHP がサポートするプロセス制御関数は、Unix 形式のプロセス生成、 プロセス実行、シグナル処理、プロセス終了機能を実装しています。 プロセス制御は Web サーバ環境で有効にするべきではなく、プロセス 制御関数のどれかが Web サーバ環境で使用された場合には、予期しない結果を 生じる可能性があります。

この文書は、プロセス制御関数の一般的な使用法を説明しようとするものです。 Unix のプロセス制御に関する詳細な情報については、fork(2), waitpid(2) および signal(2) のようなシステムのドキュメントや、 W. Richard Stevens による Advanced Programming in the UNIX Environment (Addison-Wesley) のような優れた参考書を読まれることを推奨します。

現在 PCNTL はシグナルハンドルコールバックの仕組みとして ticks を 使用しており、これは以前の仕組みよりずっと高速です。この変更は "user ticks" を使用するのと同じことです。declare() を使用して、プログラム中でコールバックの発生を許可する場所を指定する 必要があります。これにより、非同期のイベントを処理する際の オーバーヘッドを最小限に抑えることが可能となります。以前は、pcntl を 有効にして PHP をコンパイルすると、pcntl の使用の有無にかかわらず 常にこのオーバーヘッドの被害を被っていたのです。

PHP 4.3.0 より前のバージョンで pcntl を使用していたすべてのスクリプトに ついて、1 点だけ修正する必要があります。それは、コールバックを許可 したい場所に declare() を使用するか、あるいは declare() の新しいグローバル書式を使用して スクリプト全体で ticks を有効にすることです。

注意: この拡張モジュールは Windows 環境では利用できません。

要件

外部ライブラリを必要としません。

インストール手順

PHPがサポートするプロセス制御機能は、デフォルトでは有効となってい ません。プロセス制御機能を有効にするには、 configure のオプションに --enable-pcntl を付け、CGI 版あるいは CLI 版の PHP をコンパイルする必要があります。

注意: 現在、このモジュールは非 Unix 環境(Windows)では動作しません。

実行時設定

設定ディレクティブは定義されていません。

リソース型

リソース型は定義されていません。

定義済み定数

以下のシグナルのリストがプロセス制御関数でサポートされています。 これらのシグナルのデフォルト動作の詳細については、 signal(7) のマニュアルを参照ください。

WNOHANG (integer)

WUNTRACED (integer)

SIG_IGN (integer)

SIG_DFL (integer)

SIG_ERR (integer)

SIGHUP (integer)

SIGINT (integer)

SIGQUIT (integer)

SIGILL (integer)

SIGTRAP (integer)

SIGABRT (integer)

SIGIOT (integer)

SIGBUS (integer)

SIGFPE (integer)

SIGKILL (integer)

SIGUSR1 (integer)

SIGSEGV (integer)

SIGUSR2 (integer)

SIGPIPE (integer)

SIGALRM (integer)

SIGTERM (integer)

SIGSTKFLT (integer)

SIGCLD (integer)

SIGCHLD (integer)

SIGCONT (integer)

SIGSTOP (integer)

SIGTSTP (integer)

SIGTTIN (integer)

SIGTTOU (integer)

SIGURG (integer)

SIGXCPU (integer)

SIGXFSZ (integer)

SIGVTALRM (integer)

SIGPROF (integer)

SIGWINCH (integer)

SIGPOLL (integer)

SIGIO (integer)

SIGPWR (integer)

SIGSYS (integer)

SIGBABY (integer)

この例は、シグナルハンドラを有するデーモンプロセスをフォークします。

例 1. プロセス制御の例

<?php
declare(ticks=1);

$pid = pcntl_fork();
if (
$pid == -1) {
     die(
"fork できません");
} else if (
$pid) {
     exit();
// 親プロセスの場合
} else {
     
// 子プロセスの場合
}

// 制御側の端末からデタッチ
if (!posix_setsid()) {
    die(
"could not detach from terminal");
}

// 無限ループでタスク実行
while (1) {

    
// 何か面白いことをここで行う

}

function
sig_handler($signo)
{

     switch (
$signo) {
         case
SIGTERM:
             
// 終了タスクを処理
             
exit;
             break;
         case
SIGHUP:
             
// 再起動タスクを処理
             
break;
         default:
             
// その他の全てのシグナルを処理
     
}

}

// シグナルハンドラを設定
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

?>

参考

POSIX 関数の節を参照することも 有用でしょう。

目次
pcntl_alarm --  シグナルを送信するアラームを設定する
pcntl_exec --  カレントのプロセス空間で指定したプログラムを実行する
pcntl_fork -- 現在実行中のプロセスをフォークする
pcntl_getpriority --  プロセスの優先度を取得する
pcntl_setpriority --  プロセスの優先度を変更する
pcntl_signal -- シグナルハンドラを設定する
pcntl_wait --  待つかフォークした子プロセスのステータスを返す
pcntl_waitpid -- 待つかフォークした子プロセスのステータスを返す
pcntl_wexitstatus --  終了した子プロセスのリターンコードを返す
pcntl_wifexited --  ステータスコードが正常終了を表す場合に TRUE を返す
pcntl_wifsignaled --  ステータスコードがシグナルによる終了を表す場合に TRUE を返す
pcntl_wifstopped --  子プロセスが現在停止している場合、TRUE を返す
pcntl_wstopsig --  子プロセスを停止させたシグナルを返す
pcntl_wtermsig --  子プロセスの終了を生じたシグナルを返す