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) のマニュアルを参照ください。
この例は、シグナルハンドラを有するデーモンプロセスをフォークします。
Example#1 プロセス制御の例
<?php
declare(ticks=1);
$pid = pcntl_fork();
if ($pid == -1) {
die("fork できません");
} else if ($pid) {
exit(); // 親プロセスの場合
} else {
// 子プロセスの場合
}
// 制御側の端末からデタッチ
if (posix_setsid() == -1) {
die("could not detach from terminal");
}
// シグナルハンドラを設定
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
// 無限ループでタスク実行
while (1) {
// 何か面白いことをここで行う
}
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// 終了タスクを処理
exit;
break;
case SIGHUP:
// 再起動タスクを処理
break;
default:
// その他の全てのシグナルを処理
}
}
?>
POSIX 関数の節を参照することも 有用でしょう。