ホームページ  >  記事  >  バックエンド開発  >  PHP シングルスレッドによる Web ページの並列クロールの実装_PHP チュートリアル

PHP シングルスレッドによる Web ページの並列クロールの実装_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:22:381293ブラウズ

Web ページの並列クロールの PHP シングルスレッド実装

この PHP チュートリアルでは、複数のページ情報を並列クロールするプロセスをシミュレートします。鍵はシングルスレッドの並列処理にあります。

通常の状況では、複数のページから情報を取得するプログラムを作成するときに誰もがシリアル ソリューションを使用しますが、取得サイクルが長すぎて実用的ではありません。そこで、curlを使って並列クロールすることを考えました。しかし、その仮想サーバーにはカールが存在しないことが最終的に判明し、非常に混乱しました。そこで、考え方を変えて、単一のスレッドを使用して複数のスレッドの効果を実現することにしました。ネットワークプログラミングについて知りたいです

IO 再利用の概念を知っている人は、もちろん PHP でもサポートされており、拡張機能は必要ありません。

プログラミング経験が長年ある人は、PHPのストリーム機能についてあまり知らないかもしれません。 PHP の圧縮ファイル ストリーム、ファイル ストリーム、および tcp プロトコルに基づくアプリケーションは、すべて 1 つのストリームにカプセル化されます。それで、ローカルファイルを読んでください

ネットワークファイルの読み取りと違いはありません。ここまで述べましたが、基本的には皆さんも理解していると思います。コードを貼り付けてみましょう。

コードは比較的大まかですが、実際に使用する場合は、まだいくつかの詳細に対処する必要があります。

コード

関数 http_get_open($url)

{

$url = parse_url($url);

if (empty($url['host'])) {

false を返す;

}

$host = $url['host'];

if (empty($url['path'])) {

$url['path'] = "/";

}

$get = $url['path'] . "?"

$fp = stream_socket_client("tcp://{$host}:80", $errno, $errstr, 30);

if (!$fp) {

エコー「$errstr ($errno)」

ん」;


false を返す;

} 他 {

fwrite($fp, "GET {$get} HTTP/1.0rnHost: {$host}rnAccept: */*rnrn");

}

$fp を返す;

}

関数 http_multi_get($urls)

{

$result = array();

$fps = array();

foreach ($urls as $key => $url)

{

$fp = http_get_open($url);

if ($fp === false) {

$result[$key] = false;

} 他 {

$result[$key] = '';

$fps[$key] = $fp;

}

}

ながら(1)

{

$reads = $fps;

if (empty($reads)) {

休憩;

}

if (($num = stream_select($reads, $w = null, $e = null, 30)) === false ) {

エコー「エラー」;

false を返す;

} else if ($num > 0) {//can read

foreach ($は$valueとして読み取られます)

{

$key = array_search($value, $fps);

if (!feof($value)) {

$result[$key] .= fread($value, 128);

} 他 {

unset($fps[$key]);

}

}

} else {//タイムアウト

エコー「タイムアウト」;

false を返す;

}

}

foreach ($result as $key => &$value)

{

if ($value) {

$value =explode("rnrn", $value, 2);

}

}

$result を返す;

}

$urls = array();

$urls[] = "http://www.qq.com";

$urls[] = "http://www.sina.com.cn";

$urls[] = "http://www.sohu.com";

$urls[] = "http://www.blue1000.com";

//並行クロール

$t1 = microtime(true);

$result = http_multi_get($urls);

$t1 = microtime(true) - $t1;

var_dump("コスト: " . $t1);

//シリアルキャプチャ

$t1 = microtime(true);

foreach ($urlsを$valueとして)

{

file_get_contents($value);

}

$t1 = microtime(true) - $t1;

var_dump("コスト: " . $t1);

?>

最終的な実行結果:

文字列「コスト: 3.2403128147125」(長さ=21)

文字列「コスト: 6.2333900928497」(長さ=21)

基本的に効率が 2 倍になります。もちろん、Sina は非常に遅く、約 2.5 秒かかります。

基本的に私は彼に引きずり込まれました、360は0.2秒しかかかりません

すべてのWebサイトの速度が同等で、並列数が多ければ、その差の倍数は大きくなります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/847205.html技術記事 Web ページの並列クロールの PHP シングルスレッド実装 この PHP チュートリアルでは、複数のページ情報を並列クロールするプロセスをシミュレートします。鍵はシングルスレッドの並列処理にあります。 通常、誰もが複数のページをクロールするために書き込みます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。