PHPマルチプロセス実践(3)

WBOY
リリース: 2016-06-13 12:56:26
オリジナル
1070 人が閲覧しました

PHPマルチプロセス実践(3)

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

スクリプト test1.php を書く

<?php
date_default_timezone_set( 'Asia/Chongqing');
$tasks = array(
     'http://localhost/feedbowl/t2.php?job=task1',
     'http://localhost/feedbowl/t2.php?job=task2',
     'http://localhost/feedbowl/t2.php?job=task3'
);
$mh = curl_multi_init();
foreach ($tasks as $i => $task){
     $ch[$i] = curl_init();
     curl_setopt($ch[$i], CURLOPT_URL, $task);
     curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1);
     curl_multi_add_handle($mh, $ch[$i]);
}
do {$mrc = curl_multi_exec($mh,$active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
     if (curl_multi_select($mh) != -1) {
       do {$mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
     }
}
// completed, checkout result
foreach ($tasks as $j => $task){
     if (curl_error($ch[$j])){
          echo "task ${j} [$task ] error " , curl_error($ch[$j]), "\r\n" ;
     } else {
          echo "task ${j} [$task ] get: \r\n" , curl_multi_getcontent($ch[$j]), "\r\n" ;
     }
}
?>
ログイン後にコピー



スクリプト test2.php を書く

<?php
date_default_timezone_set( 'Asia/Chongqing');
echo "child start, pid ", getmypid(), "\r\n" ;
for ($i=0; $i<5; ++$i){
     beep();
}
exit (0);
// ***
function beep(){
    echo getmypid(), "\t" , date('Y-m-d H:i:s' , time()), "\r\n";
    sleep(1);
}
?>
ログイン後にコピー



コマンドラインから実行
#php -f test1.php &

出力結果
タスク 0 [http://localhost/feedbowl/t2.php?job=task1] get:
子スタート、pid 5804
5804 2013-01-15 20:22:35
5804 2013-01-15 20:22:36
5804 2013-01-15 20:22:37
5804 2013-01-15 20:22:38
5804 2013-01-15 20:22:39

タスク 1 [http://localhost/feedbowl/t2.php?job=task2] get:
子スタート、pid 5804
5804 2013-01-15 20:22:35
5804 2013-01-15 20:22:36
5804 2013-01-15 20:22:37
5804 2013-01-15 20:22:38
5804 2013-01-15 20:22:39

タスク 2 [http://localhost/feedbowl/t2.php?job=task3] get:
子スタート、pid 5804
5804 2013-01-15 20:22:35
5804 2013-01-15 20:22:36
5804 2013-01-15 20:22:37
5804 2013-01-15 20:22:38
5804 2013-01-15 20:22:39

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