ホームページ >バックエンド開発 >PHPチュートリアル >PHP のマルチプロセス プログラミング手法の詳細な探索、PHP プロセス プログラミングの探索_PHP チュートリアル

PHP のマルチプロセス プログラミング手法の詳細な探索、PHP プロセス プログラミングの探索_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:44:16794ブラウズ

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下でのマルチスレッド

Windows システムは pcntl 関数をサポートしていません。幸いなことに、内部マルチスレッドを使用して複数のリンクにアクセスするツールcurl_multi_exec() があり、各リンクをタスクとして使用できます。

スクリプトtest1.phpを書く



リーリー

スクリプトtest2.phpを書く



リーリー

コマンドラインで実行


リーリー

結果を出力する


リーリー

印刷された時間から、複数のタスクがほぼ同時に実行されていることがわかります。


http://www.bkjia.com/PHPjc/1049142.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1049142.html技術記事 PHP のマルチプロセス プログラミング方法を詳しく調べ、PHP プロセス プログラミングでのサブプロセスの作成について調べます。サブプロセスを作成する一般的な方法は、php$pid = pcntl_fork();if($pid == -1) です。 ){ //作成に失敗しました die(' できます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。