1

some.txt ファイルを受け取り、リンクを読み取り、ウェブサイトのバックリンクがあるかどうかを返すスクリプトがあります。しかし、問題は、それが非常に遅いことです。私はその速度を上げたいと思っています。その速度を上げる方法はありますか?

<?php
ini_set('max_execution_time', 3000);
$source = file_get_contents("your-backlinks.txt");
$needle = "http://www.submitage.com";   //without http as I have imploded the http later in the script
$new = explode("\n",$source);
foreach ($new as $check) {
$a = file_get_contents(trim($check));
if (strpos($a,$needle)) {
$found[] = $check;
     } else {
     $notfound[] = $check;
            }
                        }
echo "Matches that were found: \n ".implode("\n",$found)."\n";
echo "Matches that were not found \n". implode("\n",$notfound);
?>
4

2 に答える 2

2

最大のボトルネックは、HTTP リクエストを並列ではなく順番に実行していることです。curl複数のリクエストを並行して実行できます。これはドキュメントの例で、ループを使用して実際に結果を収集するように大幅に調整されています。それが正しいとは約束できません。ドキュメントに正しく従っていることだけを約束します。

$mh = curl_multi_init();
$handles = array();

foreach($new as $check){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $check);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_multi_add_handle($mh,$ch);
  $handles[$check]=$ch;
}

// verbatim from the demo
$active = null;
//execute the handles
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);
    }
}
// end of verbatim code

for($handles as $check => $ch){
  $a = curl_multi_getcontent($ch)
  ...
}
于 2012-11-26T12:09:56.573 に答える
0

おそらくいくつかの偽のマルチスレッドソリューションを除いて、PHPを最適化することによって操作からこれ以上速度を絞り出すことはできません.

ただし、チェックをバックグラウンド タスクとして実行できるキュー システムを作成できます。URL を反復処理するときに URL をチェックする代わりに、それらをキューに追加します。次に、チェックされていない URL をキューから 1 つずつ取得し、ドメインへの参照が含まれているかどうかをチェックして結果を保存する cron スクリプトを作成します。

于 2012-11-26T11:45:27.157 に答える