ホームページ > 記事 > PHPフレームワーク > swooleのマルチプロセス操作を見てみる
#複数のタスクを同時に実行する
順次実行されたタスクを並列実行に変換します (タスク 論理的にはたとえば、既知のユーザー データから電子メールやテキスト メッセージを送信する必要があるかどうかを判断し、送信する必要がある場合は送信する必要があります。 マルチプロセスを使用しない場合は、まずメールを送信するかどうかを判断して必要に応じて送信し、次にテキストメッセージの送信が必要かどうかを判断して必要に応じて送信します。電子メールの送信に 2 秒かかり、テキスト メッセージの送信に 2 秒かかる場合、タスクが完了するまでに約 4 秒かかります。 マルチスレッドを使用すると、メール処理用とテキストメッセージ処理用の2つのスレッドを開くことができ、合計2秒程度で処理時間が半分に短縮されます。
<?php/** * Created by PhpStorm. * User: zhezhao * Date: 2016/10/20 * Time: 10:37 */$info = array( "sendmail"=>1, "mailto"=>"12345@qq.com", "sendsms"=>1, "smsto"=>"123456");echo "start:".date("Y-m-d H:i:s").PHP_EOL;$mail_process = new swoole_process('sendMail',true);$mail_process->start();$sms_process = new swoole_process('sendSMS',true);$sms_process->start();//主进程输出子进程范围内容echo $mail_process->read();echo PHP_EOL;echo $sms_process->read();echo PHP_EOL;echo "end:".date("Y-m-d H:i:s").PHP_EOL;//并行函数function sendMail(swoole_process $worker){ global $info; if($info['sendmail']==1){ sleep(2); $worker->write("send mail to ".$info['mailto']); } }function sendSMS(swoole_process $worker){ global $info; if($info['sendmail']==1){ sleep(2); $worker->write("send sms to ".$info['smsto']); } }
大きなタスクを複数の小さなタスクに分割するタスク
周期的に実行されるタスクを複数のプロセスに分割して実行し、作業効率を向上させます現在、curl を通じて Web コンテンツを取得するシステムがあるとします。要件として、10 個の Web ページをクロールする必要があります。URL アドレスは配列を通じて読み取られます。各カールには 2 秒かかります。これら 10 個の Web ページを for ループでクロールすると、20 秒かかります。マルチプロセスを使用すると、タスクを 5 つの部分に分割し、それぞれを 5 つのプロセスで実行できます。各プロセスは 2 つの URL を取得し、同時に実行します。合計4秒で効率は5倍になります。
<?php/** * Created by PhpStorm. * User: zhezhao * Date: 2016/10/20 * Time: 10:51 */$url_arr = array();for ($i=0;$i<10;$i++){ $url_arr[] = "www.baidu.com?wd=".$i; }echo "start:".date("Y-m-d H:i:s").PHP_EOL;$workers = array();for ($i=0;$i<5;$i++){ $process = new swoole_process('getContents',true); $process->start(); $process->write($i); $workers[] = $process; }//主进程数据结果foreach ($workers as $process){ echo $process->read(); echo PHP_EOL; }echo "end:".date("Y-m-d H:i:s").PHP_EOL;function getContents(swoole_process $worker){ $i = $worker->read(); global $url_arr; $res1 = execCurl($url_arr[($i*2)]); $res2 = execCurl($url_arr[($i*2+1)]); echo $res1.PHP_EOL.$res2; }function execCurl($url){ sleep(2); return "handle ".$url." finished"; }
概要
上記の状況はいずれも、本質的には、論理的な順序を持たないタスクを 1 つに結合するものです。プロセスは同時に実行されます。効率を向上させるために。 PHP メカニズム自体はマルチスレッド操作を提供しませんが、ptcl 拡張機能は、PHP が Linux マルチプロセスを操作するためのインターフェイスを提供します。 個人的にはswooleの多工程処理方式のほうが便利な気がします。以上がswooleのマルチプロセス操作を見てみるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。