PHP がマルチスレッドを処理する方法

王林
リリース: 2023-02-24 18:56:01
オリジナル
4172 人が閲覧しました
#推奨マニュアル:php完全独習マニュアル

PHP がマルチスレッドを処理する方法##PHP処理マルチスレッド

# Notes

1、php5.3 以降、スレッドセーフなバージョンです。 Apache と php で使用されるコンパイラは一貫している必要があります。

2. phpinfo() を通じてスレッド セーフが有効になっている場合、それはスレッド セーフ バージョンです。

3. phpinfo() で Compiler 項目を表示することで、使用されているコンパイラを知ることができます。私のものはMSVC9 (Visual C 2008)です。

私の使用環境

32ビットwindows xp sp3、wampserver2.2d(php5.3.10-vc9 apache2.2.21-vc9)。

1. pthreads 拡張機能のダウンロード

私の環境では、pthreads-2.0.8-5.3-ts-vc9-x86 をダウンロードしました。

2.0.8 は pthread のバージョンを表します。

5.3 は PHP のバージョンを表します。

ts は、php にはスレッドセーフなバージョンが必要であることを意味します。

vc9 は、php を Visual C 2008 コンパイラでコンパイルする必要があることを意味します。

x86 は 32 ビットを意味します

2. pthreads 拡張機能をインストールします

1. php_pthreads.dll をディレクトリ bin\php\ext\ にコピーします。 (私のパスは D:\wamp\bin\php\php5.3.10\ext です) 2. pthreadVC2.dll をディレクトリ bin\php\ にコピーします。 (私のパスは D:\wamp\bin\php\php5.3.10 です)

3. pthreadVC2.dll をディレクトリ C:\windows\system32 にコピーします。

4. PHP 設定ファイル php.ini を開きます。最後に extension=php_pthreads.dll

プロンプトを追加します。

Windows システムでは、pthreadVC2.dll のパスを PATH 環境変数に追加する必要があります。 [マイ コンピュータ] --->マウスの右ボタン ---> [プロパティ] ---> [詳細設定] ---> 環境変数 --->システム変数 --->Path という名前のパスを検索 ---> ;編集--->変数値の末尾に pthreadVC2.dll のフル パスを追加します。

3. pthreads 拡張機能をテストします

class AsyncOperation extends \Thread {
    public function __construct($arg){
            $this->arg = $arg;
    }
     public function run(){ 
            if($this->arg){ 
            printf("Hello %s\n", $this->arg);
             }    
      }
}
$thread = new AsyncOperation("World");
if($thread->start())    
$thread->join();
?>
ログイン後にコピー
上記のコードを実行すると、Hello World が表示され、pthreads 拡張機能が正常にインストールされたことが示されます。

2.curl_multi_init()

<?php
echo date("Y-m-d H:m:s",time());
echo " ";
echo floor(microtime()*1000);
echo "<br>";
$mtime = explode(" ", microtime());
$mtime = $mtime[1].($mtime[0] * 1000);
$mtime2 = explode(".", $mtime);
$mtime = $mtime2[0];
echo $mtime;
echo "<br>";
$urls = array(
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;);
print_r(async_get_url($urls)); // [0] => example1, [1] => example2
echo "<br>";
echo date("Y-m-d H:m:s",time());
echo " ";
echo floor(microtime()*1000);
echo "<br>";
$mtime_ = explode(" ", microtime());
$mtime_ = $mtime_[1].($mtime_[0] * 1000);
$mtime2_ = explode(".", $mtime_);
$mtime_ = $mtime2_[0];
echo $mtime_;
echo "<br>";
echo $mtime_ - $mtime;
function async_get_url($url_array, $wait_usec = 0)
{
if (!is_array($url_array))
return false;
$wait_usec = intval($wait_usec);
$data = array();
$handle = array();
$running = 0;
$mh = curl_multi_init(); // multi curl handler
$i = 0;
foreach($url_array as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don&#39;t print
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
$handle[$i++] = $ch;
}
/* 执行 */
do {
curl_multi_exec($mh, $running);
if ($wait_usec > 0) /* 每个 connect 要间隔多久 */
usleep($wait_usec); // 250000 = 0.25 sec
} while ($running > 0);
/* 读取资料 */
foreach($handle as $i => $ch) {
$content = curl_multi_getcontent($ch);
$data[$i] = (curl_errno($ch) == 0) ? $content : false;
}
/* 移除 handle*/
foreach($handle as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
return $data;
}
?>
ログイン後にコピー
curl_multi_init()について

一般的に、curl_multi_init() の使用を検討するのは次のような場合です。 、目的は、複数の URL を 1 つずつリクエストするのではなく、同時にリクエストすることです。それ以外の場合は、curl_init() が必要になります。ただし、curl_multi を使用すると、過剰な CPU 消費や Web ページの一時停止などの現象が発生する場合があります。curl_multi によって引き起こされる Web ページの一時停止の問題を解決する方法を参照してください。

curl_multi を使用する手順は次のように要約されます。

ステップ 1:curl_multi_init を呼び出す

ステップ 2:curl_multi_add_handle をループ内で呼び出す

必要なものこのステップで注意すべき点は、curl_multi_add_handle の 2 番目のパラメータが、curl_init のサブハンドルであることです。

ステップ 3:curl_multi_exec を継続的に呼び出します

ステップ 4:curl_multi_getcontent を周期的に呼び出して、必要に応じて結果を取得します

ステップ 5:curl_multi_remove_handle を呼び出し、単語ハンドルごとに呼び出しますcurl_close

ステップ 6:curl_multi_close を呼び出す

##各関数の説明:

##curl_multi_init()カールバッチハンドルリソース。

curl_multi_add_handle()

個々の Curl ハンドル リソースを Curl バッチ セッションに追加します。 curl_multi_add_handle() 関数には 2 つのパラメータがあり、最初のパラメータは CURL バッチ ハンドル リソースを表し、2 番目のパラメータは個別の CURL ハンドル リソースを表します。

curl_multi_exec()

curl バッチ ハンドルを解析します。curl_multi_exec() 関数には 2 つのパラメータがあります。最初のパラメータはバッチ ハンドル リソースを表し、2 番目のパラメータは最初のパラメータは参照値を持つパラメータで、処理する必要がある残りの個別のカール ハンドル リソースの数を示します。

curl_multi_remove_handle()

curl バッチ ハンドル リソースのハンドル リソースを削除します。curl_multi_remove_handle() 関数には 2 つのパラメータがあります。最初のパラメータは、curl バッチ ハンドル リソースを表します、2 番目のパラメータは別のカール ハンドル リソースを表します。

curl_multi_close()

バッチ ハンドル リソースを閉じます。

curl_multi_getcontent()

CURLOPT_RETURNTRANSFER が設定されている場合、取得された出力のテキスト ストリームを返します。

curl_multi_info_read()

現在解析されているcurlの関連する送信情報を取得します。

おすすめ関連記事:
1.PHP でマルチスレッドを実装する方法
2.PHP でマルチスレッドを実装する 3 つの方法
関連ビデオの推奨:
1.Dugu Jiijian (4)_PHP ビデオ チュートリアル

推奨チュートリアル: PHP ビデオ チュートリアル

以上がPHP がマルチスレッドを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!