ホームページ >バックエンド開発 >PHPの問題 >PHPプロセス間で通信するにはいくつかの方法があります

PHPプロセス間で通信するにはいくつかの方法があります

(*-*)浩
(*-*)浩オリジナル
2019-09-25 10:03:083068ブラウズ

PHP がプロセス間で通信するには、パイプ (Pipe) と名前付きパイプ (名前付きパイプ)、シグナル (Signal)、メッセージ (メッセージ) キュー (メッセージ キュー)、共有メモリ、シグナル セマフォ、ソケット。

PHPプロセス間で通信するにはいくつかの方法があります

#この記事では、有名なパイプを経由して紹介するものをリストします。

パイプは、略語間の通信データを運ぶために使用されます。理解を容易にするために、パイプをファイルに例えると、プロセス A がパイプ P にデータを書き込み、次にプロセス B がパイプ P からデータを読み取ります。

php が提供するパイプライン操作 API は、基本的にファイル操作 API と同じで、パイプラインの作成に posix_mkfifo 関数を使用する点を除けば、読み込み、書き込み操作はファイル操作関数と同じです。

もちろん、ファイルを直接使用してパイプラインをシミュレートすることはできますが、その場合、パイプラインの機能は使用できなくなります。

パイプを介した通信の一般的な考え方は、まずパイプを作成し、次に子プロセスがパイプに情報を書き込み、親プロセスがパイプから情報を読み取ることです。これにより、親と子はプロセスは直接通信できます。

<?php
/**
 * author: NickBai
 * createTime: 2016/12/2 0002 上午 11:12
 */
//创建管道
$pipePath = "/tmp/test.pipe";
if( !file_exists( $pipePath ) ){
    if( !posix_mkfifo( $pipePath, 0666 ) ){
        exit(&#39;make pipe false!&#39; . PHP_EOL);
    }
}
//创建进程,子进程写管道,父进程读管道
$pid = pcntl_fork();
if( $pid == 0 ){
    //子进程写管道
    $file = fopen( $pipePath, &#39;w&#39; );
    fwrite( $file, &#39;hello world&#39; );
    sleep(1);
    exit();
}else{
    //父进程读管道
    $file = fopen( $pipePath, &#39;r&#39; );
    //stream_set_blocking( $file, False );  //设置成读取非阻塞
    echo fread( $file, 20 ) . PHP_EOL;
    pcntl_wait($status);  //回收子进程
}

注: このコードは、Linux および php-cli モードでのみ実行できます。

7行目: パイプラインのパスを指定します。これは通常のファイルと変わりません。

行 9: posix_mkfifo 関数を使用してパイプを作成し、読み取りおよび書き込み権限を 0666 に設定します。


行 15: pcntl_fork 関数を使用して子プロセスを作成します。以降、プログラムは 2 つのプロセスで実行されることに注意してください。 pcntl_fork 関数は非常に特殊で、一度呼び出すと複数の戻り値を返します。親プロセスの場合: 子プロセスの ID を返します。この値は 0 より大きくなります。子プロセスでは0を返します。 -1 が返された場合は、作成プロセスが失敗したことを示します。

行 17: 2 つのプロセスは、現在のプロセスによって取得された異なる $pid 値に基づいて異なる分岐に入ります。

行 18 ~ 22: 子プロセスはパイプを開き、それに hello world を書き込み、スリープに入り、スリープが終了した後に終了します。


行 25~29: 親プロセスはパイプを開いて読み取り、最後に 29 行目のコードを実行して子プロセスをリサイクルします。ここにはブロックされている場所が 2 つあります。1 つ目はデフォルトの読み取り場所です。データが返される前に、子プロセスが終了コマンドを発行するまで待つ必要があります。プロセスをリサイクルする pcntl_wait メソッドもあります。プロセスが終了するまで待ちます。

以上がPHPプロセス間で通信するにはいくつかの方法がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。