クラスHttp_MultiRequest
{
// 並行してクロールされる URL のリスト
プライベート $urls = array();
//カールオプション
プライベート $オプション;
//コンストラクター
関数 __construct($options = array())
{
$this->setOptions($options);
}
//URLリストを設定します
関数 setUrls($urls)
{
$this->urls = $urls;
$this を返します;
}
// オプションを設定します
関数 setOptions($options)
{
$options[CURLOPT_RETURNTRANSFER] = 1;
if (isset($options['HTTP_POST']))
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']);
unset($options['HTTP_POST']);
}
if (!isset($options[CURLOPT_USERAGENT]))
{
$options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.1; SV1;)';
}
if (!isset($options[CURLOPT_FOLLOWLOCATION]))
{
$options[CURLOPT_FOLLOWLOCATION] = 1;
}
if (!isset($options[CURLOPT_HEADER]))
{
$options[CURLOPT_HEADER] = 0;
}
$this->options = $options;
}
//すべてのコンテンツを並行して取得します
関数exec()
{
if(empty($this->urls) || !is_array($this->urls))
{
false を返します;
}
$curl = $data = array();
$mh =curl_multi_init();
foreach($this->urls as $k =>$v)
{
$curl[$k] = $this->addHandle($mh, $v);
}
$this->execMulitHandle($mh);
foreach($this->urls as $k =>$v)
{
$data[$k] =curl_multi_getcontent($curl[$k]);
curl_multi_remove_handle($mh, $curl[$k]);
}
curl_multi_close($mh);
$data を返します;
}
// 1 つの Web ページのコンテンツのみを取得します。
関数execOne($url)
{
if (空($url)) {
false を返します;
}
$ch =curl_init($url);
$this->setOneOption($ch);
$content =curl_exec($ch);
curl_close($ch);
$content を返します;
}
//内部関数、特定のハンドルのオプションを設定します
プライベート関数 setOneOption($ch)
{
curl_setopt_array($ch, $this->オプション);
}
// 新しい並列クロール ハンドルを追加します
プライベート関数 addHandle($mh, $url)
{
$ch =curl_init($url);
$this->setOneOption($ch);
curl_multi_add_handle($mh, $ch);
$ch を返します;
}
//並列実行 (この書き方はよくある間違いですが、私は今でもここでこの書き方、この書き方を使っています
)
//小さなファイルをダウンロードするとカップが 100% を占める可能性があり、このサイクルは 100,000 回以上実行されます
//これは原理を理解していないために発生する典型的なエラーです。このエラーは、PHP 公式ドキュメントでよく見られます。 )
プライベート関数 execMulitHandle($mh)
{
$running = null;
やります{
curl_multi_exec($mh, $running);
} while ($running > 0);
}
}
/*以下は上記のクラスのテストの例です:*/
$urls = array("http://baidu.com", "http://baidu.com", "http://baidu.com", "http://baidu.com", "http:// baidu.com"、"http://baidu.com"、"http://www.google.com"、"http://www.sina.com.cn"、);
$m = 新しい Http_MultiRequest();
$t = マイクロタイム(true);
$m->setUrls($urls);
//パラレルフェッチ (パラレルフェッチ):
$data = $m->exec();
$Parallel_time = microtime(true) - $t;
echo $Parallel_time . "n";
$t = マイクロタイム(true);
//シリアルフェッチ(シリアルフェッチ):
foreach ($urls を $url として)
{
$data[] = $m->execOne($url);
}
$serial_time = microtime(true) - $t;
エコー $serial_time . "n";
この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。
http://www.bkjia.com/PHPjc/965524.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/965524.html技術記事 PHP マルチスレッドの内部マルチスレッドの例の分析 この記事では、主に PHP マルチスレッドの内部マルチスレッドの使用スキルを分析します。これには、一定の参考値とニーズがあります。