2015-06-25 6 views
8

Hintergrund:Call to URLFetch fehlgeschlagen mit Anwendungsfehler 5 für url x

ich Google App Engine verwenden und einen seltsamen Fehler in meinen Website-Crawler habe.

Ich habe ein Backend, das jede Nacht automatisch eine Website crawlen wird. Dies wird durch eine Aufgabe ausgelöst, die aufgrund von Zeitbeschränkungen in PHP auf eine pushQueue geschoben wird.

Problem:

Wenn ich das Skript manuell ausführen, der die Aufgabe erstellt, schließt die Aufgabe ohne Fehler zu erwarten. Wenn Cron die Aufgabe startet, erhalte ich den folgenden Fehler.

Call to URLFetch fehlgeschlagen mit Anwendungsfehler 5 für url x

Code:

function url_get_contents ($Url) { 
    global $retry; 
    try { 
     if (!function_exists('curl_init')){ 
      die('CURL is not installed!'); 
     } 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $Url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $output = curl_exec($ch); 
     curl_close($ch); 
     return $output; 
    } catch (Exception $e) { 
     syslog(LOG_INFO, 'Caught exception: ', $e->getMessage()); 
     if($retry > 0){ 
      $retry -= 1; 
      return url_get_contents($Url); 
     } 
     else{ 
      return null; 
     } 
    } 
} 

Dank syslog ich sehen kann, dass die $ url in Ordnung ist, die mich treibt verrückt es funktioniert, wenn das exakt gleiche Skript manuell nicht über Cron gestartet wird.

Wie kann ich das beheben?

Vielen Dank im Voraus.

+1

Überprüfen Sie, ob Ihre PHP richtige Konfiguration für cli Umwelt hat. – Inurosen

+1

Ah, das könnte es sein, ich nehme nicht an, dass Sie wissen, wie man das auf GAE überprüft? Ich habe eine php.ini, aber wie finde ich heraus, ob es der eine ist, den cli php benutzt? – Grushton94

+1

Warum nicht file_get_contents() verwenden - das auch den URLFetch-Handler verwendet, aber Ihnen sagen wird, ob das Problem cURL ist oder nicht. – Tom

Antwort

1

EDIT: curl ist definitiv installiert, wie Sie eine Aussage haben, die es in erster Linie überprüft, so dass meine Antwort nicht mehr steht.

Die CURL-Fehlerliste http://curl.haxx.se/libcurl/c/libcurl-errors.html besagt, dass Fehler 5 CURLE_COULDNT_RESOLVE_PROXY ist. Irgendwie kann deine Locke wahrscheinlich nicht auf das Internet zugreifen.

Die Wellung ist wahrscheinlich nicht für Ihre CLI-Umgebung aktiviert.

Schauen Sie sich die Konfiguration hier:

php5/  phpmyadmin/ 
[email protected]:~# cd /etc/php5 
[email protected]:/etc/php5# ls 
apache2 cli conf.d mods-available 
[email protected]:/etc/php5# cd cli/ 
[email protected]:/etc/php5/cli# ls 
conf.d php.ini 
[email protected]:/etc/php5/cli# cd conf.d 
[email protected]:/etc/php5/cli/conf.d# ls 
10-pdo.ini 20-gd.ini  20-mssql.ini 20-mysql.ini  20-pdo_mysql.ini 
20-curl.ini 20-mcrypt.ini 20-mysqli.ini 20-pdo_dblib.ini 
[email protected]:/etc/php5/cli/conf.d# 
4

„Anwendungsfehler 5“ bedeutet, dass die Anforderung Frist überschritten wurde.

Sie können die Frist für die Anforderung erhöhen, indem die Option CURLOPT_TIMEOUT verwenden, so Code, den Sie vielleicht etwas wie folgt aussehen:

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $Url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 60 second timeout 
    $output = curl_exec($ch);