2016-05-18 8 views
0

Ich schreibe eine Web-Crawler auf php zu laden, ich bin mit dem folgenden Verfahren:schnellste Weg, um HTML-Datei PHP-Skript

Aktuelle Methode

function getPublicationData($url){ 
    static $seen = array(); 
    if (isset($seen[$url])) { 
     return; 
    } 
    $seen[$url] = true; 

    $cURL = curl_init($url); 
    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); 
    $htmlDoc = curl_exec($cURL); 

    $dom= new DOMDocument('1.0'); 
    libxml_use_internal_errors(true); 
    $dom->loadHTML($htmlDoc); 
    $dom_xpath = new DOMXPath($dom); 

    $strongElements = $dom_xpath->query("//strong[@class='publication-meta-type']"); 
    foreach($strongElements as $strongElement){ 
     echo $strongElement->nodeValue; 
    } 
} 

Das Problem ist, dass PHP hat ein Zeitlimit von 30 Sekunden und ich muss auf eine ziemlich große Anzahl von Seiten zugreifen (Mein Gastgeber lässt mich das Zeitlimit nicht ändern).

Es wäre schön, nur ein paar bestimmte Knoten von der Seite oder etwas in der Art zu bekommen.

Kann mir jemand eine Lösung geben?

+0

@Martin Ich vermute, OP ist auf Shared Hosting. Hosts, die die Ausführungszeit von PHP einschränken ("Mein Host lässt mich das Zeitlimit nicht ändern") lassen Sie die php.ini nicht so bearbeiten, dass diese Limits entfernt werden. – ceejayoz

+1

@ceejayoz Ich habe gerade gelesen und so meinen Kommentar gelöscht :-p – Martin

+0

Wie wird diese Methode ausgeführt? Führen Sie es aus dem Browser oder aus einem Cron-Skript? – moscar

Antwort

1

Der zeitraubende Teil ist fast sicher die HTTP-Anfragen. Man kann nicht viel tun, um das zu beschleunigen.

Lösung? Zeit, einen neuen Host zu bekommen.

1

Machen Sie einen asynchronen Aufruf Ihrer Datenbank mit HTML.

TEIL I

static $seen = array(); 
if (isset($seen[$url])) { 
    return; 
} 
$seen[$url] = true; 

$cURL = curl_init($url); 
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); 
$htmlDoc = curl_exec($cURL); 
//save in file, database, whatever 

TEIL II

erstellen einen Cron-Job oder eine andere Art und Weise Ihre Funktion aufrufen, Daten zu analysieren und in der Datenbank speichern:

$htmlDoc = //get data from whatever you decided to save 
$dom= new DOMDocument('1.0'); 
libxml_use_internal_errors(true); 
$dom->loadHTML($htmlDoc); 
$dom_xpath = new DOMXPath($dom); 

$strongElements = $dom_xpath->query("//strong[@class='publication-meta-type']"); 
foreach($strongElements as $strongElement){ 
    echo $strongElement->nodeValue; 
.... 
Verwandte Themen