0

ここにいくつかのスクリプトがありますが、3つのforeach関数が長すぎて、内部サーバーエラーが発生します。カールなどで直せますか?

コードは次のとおりです。

<?php

$dom = new DOMDocument();
@$dom->loadHTMLFile('http://www.auto-types.com');
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//li[@class='clearfix_center']/a/@href");
$output = array();
foreach($entries as $e) {  
  $dom2 = new DOMDocument();
  @$dom2->loadHTMLFile('http://www.auto-types.com' . $e->textContent);
  $xpath2 = new DOMXPath($dom2);
  $data = array();
  $items = $xpath2->query("//div[@class='modelImage']/a/@href");
  $links = array();
  foreach($items as $item) {
    $dom3 = new DOMDocument();
    @$dom3->loadHTMLFile('http://www.auto-types.com' . $item->textContent);
    $xpath3 = new DOMXpath($dom3);   
    $konacno = array();
    $krajs = $xpath3->query("//div/@onclick");
        foreach ($krajs as $kraj) {
            $konacno[] = $kraj->textContent;
        }
  }

  $data['newLinks'] = implode(', ', $konacno);

  $output[] = $data;
}

echo '<pre>' . print_r($output, true) . '</pre>';

?>
4

1 に答える 1

0

ある種の永続キューを使用してこの作業を行う方がよいでしょう。これは、データベーステーブルまたはテキストファイルである可能性があります(ここでロックすることを忘れないでください)。

新しいページをリクエストする必要があるときはいつでも、リクエストをキューに入れてください。データを見つけたら、それを保存します。完了したら、キューから次のジョブをフェッチします。スクリプトの実行時間制限を超えないようにするために、ブラウザー内転送を実行できます(ジョブをより長く実行する機会がもうない場合)。

そのページをスクレイピングして複数のワーカーを並行して実行することもできます。

于 2013-01-25T17:02:53.087 に答える