PHPのpcntlプロセス制御pcntl_fork

不言
リリース: 2023-04-02 18:48:01
オリジナル
2470 人が閲覧しました

この記事では主に PHP の pcntl プロセス制御に関する pcntl_fork を紹介します。ある参考値がありますので、共有します。必要な友人は参考にしてください。

pcntl の紹介

PHP のプロセス制御サポートは、Unix スタイルのプロセスの作成、プログラムの実行、信号処理、およびプロセスの中断を実装します。プロセス制御は Web サーバー環境では使用できないため、Web サービス環境で使用すると予期しない結果が発生する可能性があります。

本書は、各プロセス制御機能の一般的な使用方法を説明するために使用されます。 Unix プロセス制御の詳細については、fork(2)、waitpid(2)、signal(2) などに関するシステム ドキュメント、または「Unix 環境での高度なプログラミング」(著者: W. Richard Stevens、Addison-Wesley)。

PCNTL では、信号処理のコールバック メカニズムとしてティックが使用されるようになり、ティックの速度は以前の処理メカニズムをはるかに上回りました。この変更は、「ユーザー ティック」と同じセマンティクスに従います。 declare() ステートメントを使用すると、プログラム内でコールバックの発生を許可する場所を指定できます。これにより、非同期イベント処理のオーバーヘッドを最小限に抑えることができます。 PHP のコンパイル時に pcntl を有効にすると、スクリプトで pcntl が実際に使用されているかどうかに関係なく、常にこのオーバーヘッドが発生します。

1 つの調整は、PHP 4.3.0 より前のすべての pcntl スクリプトを機能させるために、コールバックが許可されると予想される (コードの) セクションでdeclare() を使用するか、新しいグローバル構文を使用することです。スクリプト全体を通して有効です。

注: この拡張機能は Windows プラットフォームでは使用できません。

公式ドキュメント

pcntl公式ドキュメント

pcntl_fork

# 来源官方

PHP 4 >= 4.1.0, PHP 5, PHP 7)

pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。

说明
int pcntl_fork ( void )
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。

返回值
成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
ログイン後にコピー

コード

<?php
/**
 * Created by PhpStorm.
 * User: Object
 * Date: 2018/6/11
 * Time: 10:12
 */

const NEWLINE = "\n\n";

if (strtolower(php_sapi_name()) != &#39;cli&#39;) {
    die("请在cli模式下运行");
}

echo "当前进程:" . getmypid() . NEWLINE;

$pid = pcntl_fork(); //fork出子进程

//fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立

if ($pid == -1) { // 创建错误,返回-1

    die(&#39;进程fork失败&#39;);

} else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id

    // 父进程逻辑
    $time = microtime(true);
    echo "我是父进程:{$time}".NEWLINE;

} else { // $pid = 0

    // 子进程逻辑
    $time = microtime(true);
    echo "我是子进程:{$time}".NEWLINE;
}
ログイン後にコピー

実行結果

当前进程:17472

我是父进程:1528697500.2961

我是子进程:1528697500.2961
ログイン後にコピー
ログイン後にコピー

fork後子プロセスが最初にロジックを実行しますか、それとも親プロセスが最初にロジックを実行しますか?

テストコード

ここでは、上記コードの親プロセスと子プロセスのif順序を変更します
if ($pid == -1) { // 创建错误,返回-1

    die(&#39;进程fork失败&#39;);

} else if (!$pid) { // $pid = 0

    // 子进程逻辑
    $time = microtime(true);
    echo "我是子进程:{$time}".NEWLINE;
} else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id

    // 父进程逻辑
    $time = microtime(true);
    echo "我是父进程:{$time}".NEWLINE;

}
ログイン後にコピー

実行結果

当前进程:17472

我是父进程:1528697500.2961

我是子进程:1528697500.2961
ログイン後にコピー
ログイン後にコピー

テスト概要

Fork は最初に親プロセス ロジックを実行し、次に子プロセス ロジックを実行します

上記がこの記事の全内容です。皆様の学習に役立つことを願っています。その他の関連コンテンツについては、 PHP 中国語 Web サイトにご注意ください。

関連する推奨事項:

PHP はリフレクションを使用してクラスといくつかの基本的なアプリケーションを取得します

以上がPHPのpcntlプロセス制御pcntl_forkの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート