ホームページ >バックエンド開発 >PHPチュートリアル >PHP のマルチプロセス プログラミング手法の詳細な探索、PHP プロセス プログラミングの探索_PHP チュートリアル
サブプロセスの作成
子プロセスを作成する一般的な方法は次のとおりです:
上記のコードが子プロセスを正常に作成すると、システムには 2 つのプロセスが存在し、1 つは親プロセス、もう 1 つは子プロセスになります。子プロセスの ID 番号は $pid です。システムが $pid = pcntl_fork(); に達すると、この場所で分岐が作成され、親プロセスと子プロセスがそれぞれ独自のプログラム コードの実行を開始します。コードの実行結果が親と子になるのですが、if と else が相互に排他的なコードで結果が出力されるのはなぜでしょうか。実際、上で述べたように、コードが pcntl_fork にある場合、親プロセスは親プロセスを実行し、子プロセスは子プロセスを実行します。コード結果には親と子が表示されます。どちらが先かという問題に関しては、システム リソースの割り当てによって異なります。
データを処理するために複数のプロセスを開始する必要がある場合、合意された数ごとに 1,000 プロセスなど、データの量に応じてサブプロセスを開始できます。 for ループを使用するだけです。
リーリー次に、crontab を使用して、この PHP プログラムを一定期間ごとに自動的に実行します。
もちろん、サンプル コードは比較的単純です。具体的には、複数のサブプロセスが同じデータを実行しないようにする方法、または現在のプロセスがデータの処理を完了していないときに crontab が PHP ファイルの実行を再度開始するのを防ぐ方法を検討する必要があります。新しいプロセスなどを有効にするため。
PHPマルチプロセス実装
PHP マルチプロセスの実装を体系的に整理してみましょう:
1. 直接法
pcntl_fork() はプロセスを作成します。親プロセスの戻り値は子プロセスの pid です。-1 はプロセスの作成に失敗したことを示します。 Cとよく似ています。
テストスクリプトtest.php
コマンドラインで実行
結果を出力する
ご覧のとおり、3 つの子プロセスが作成され、親プロセスと並行して実行されます。行の 1 つは他の行とは若干異なる形式になっています
17931794 2013-01-14 15:04:212013-01-14 15:04:21
2 つのプロセスが同時に書き込み操作を実行するため、競合が発生します。
2. ブロック方法
ダイレクト方式を使用すると、親プロセスが子プロセスを作成した後、子プロセスの終了を待たずに実行を継続します。ここには問題はないようです。 PHPスクリプトが実行後に自動終了せずにメモリ上に常駐していると、子プロセスが再利用できないという問題が発生します。つまり、ゾンビプロセスです。 pcntl_wai() メソッドを使用してプロセスが終了するのを待ってから、終了したプロセスをリサイクルできます。
テスト スクリプトを次のように変更します:
コマンドラインで実行
結果を出力する
親プロセスは、pcntl_wait() で自身をブロックし、子プロセスの実行が完了するのを待ってから続行します。
3. ノンブロッキング方式
ブロッキング方式では複数プロセスの並列性が失われます。完成した子プロセスを再利用して並列化する方法もあります。これはブロックしない方法です。
スクリプトを変更します:
コマンドラインで実行
結果を出力する
複数のプロセスが再び並行して実行されており、約 10 秒間実行した後、実行中のプロセスを表示するには ps -ef | grep php を使用します。
lqling 2066 1388 0 16:45 ポイント/1 00:00:00 php -f t5.php
これは親プロセスであり、子プロセスがリサイクルされました。
子プロセスの終了ステータス
リーリー
Windows下でのマルチスレッド
スクリプトtest1.phpを書く
リーリー
リーリー
リーリー
リーリー