PHP マニュアル
前のページ |  | 次のページ

# CXVII. プロセス制御関数

# 導入

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");
}
// シグナルハンドラを設定
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 関数の節を参照することも 有用でしょう。

前のページ | ホーム | 次のページ
parsekit_func_arginfo | 上に戻る | pcntl_alarm