2014-05-13 11 views
5

Wir haben die Erlaubnis erhalten, ein Webcam-Bild regelmäßig von einer anderen Website zu kopieren. Wir verwenden cURL-Funktionen an anderer Stelle in unserem Code, aber wenn wir versuchen, auf dieses Bild zuzugreifen, können wir das nicht.Fehler beim cURL-Bild. Nicht sicher, was zu tun ist

Ich bin mir nicht sicher, was los ist. Der Code, den wir für viele andere cURL Funktionen ist wie folgt:

$image = 'http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard'  

$options = array(
        CURLOPT_URL => $image, 
        CURLOPT_RETURNTRANSFER => true, 
        CURLOPT_FOLLOWLOCATION => true, 
        CURLOPT_CONNECTTIMEOUT => 120, 
        CURLOPT_TIMEOUT => 120, 
        CURLOPT_MAXREDIRS => 10 
       ); 

     $ch = curl_init(); 
     curl_setopt_array($ch, $options); 
     $cURL_source = curl_exec($ch); 
     curl_close($ch); 

Dieser Code funktioniert nicht für die folgende URL (Webcam-Bild), die in einem Browser von unserem Standort zugänglich ist: http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard

Wenn ich einen Test cURL starte, scheint es nur für die Dauer des Timeouts zu hängen. $cURL_source hat nie irgendwelche Daten.

Ich habe einige andere cURL Beispiele online versucht, aber ohne Erfolg. Ich gehe davon aus, dass es eine Möglichkeit gibt, die cURL-Anfrage zu erstellen, um dies zum Laufen zu bringen, aber nichts, was ich ausprobiert habe, scheint mich irgendwohin zu bringen.

Jede Hilfe würde sehr geschätzt werden.

Dank

+1

Wenn ich es im Browser öffne, dauert es auch ewig, bis die Anfrage fehlschlägt. Ich glaube nicht, dass es einen Weg gibt, cUrl unerreichbare Ressourcen herunterzuladen. Ich würde eine stabilere Ressource zum Testen wählen.Versuchen Sie dann, 'wget' oder die Befehlszeile' curl' zu verwenden, um zu sehen, ob der Server sie tatsächlich erreichen kann (könnte Firewall sein). Wenn das funktioniert, versuchen Sie es mit PHP. – GolezTrol

+0

Wenn Sie die '$ cURL_source 'var_dump, was zeigt es? Haben Sie versucht, 'curl_error ($ ch);' zu sehen, welcher Fehler auftaucht? – Javad

+0

GolezTrol, ich kann auf die URL in einem Browser zugreifen. Manchmal dauert es eine Weile, aber nicht immer. @Javad $ cURL_source hat nie etwas darin und ich bekomme "konnte nicht mit Host verbinden" von curl_error ($ ch) – edeneye

Antwort

1

Können Sie die URL von dem Server abrufen, auf dem dieser Code ausgeführt wird? Vielleicht sind Firewall-Regeln vorhanden? Sie holen von einem Nicht-Standard-Port: 10202. Es muss von Ihrer Firewall erlaubt werden.

Ich, wie die anderen, fand es einfach, das Bild mit curl/php zu holen.

+0

+1 für Firewall-Port –

3

Ich sehe keine Probleme mit Ihrem Code. Sie können manchmal aufgrund verschiedener Netzwerkprobleme Fehler bekommen. Sie können versuchen, auf eine gute Antwort in der Schleife zu warten, um die Erfolgschancen zu erhöhen.

Etwas wie:

$image = 'http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard'; 
$tries = 3; // max tries to get good response 
$retry_after = 5; // seconds to wait before new try 

while($tries > 0) { 
    $options = array(
     CURLOPT_URL => $image, 
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_FOLLOWLOCATION => true, 
     CURLOPT_CONNECTTIMEOUT => 10, 
     CURLOPT_TIMEOUT => 10, 
     CURLOPT_MAXREDIRS => 10 
    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, $options); 
    $cURL_source = curl_exec($ch); 
    curl_close($ch); 

    if($cURL_source !== false) { 
     break; 
    } 
    else { 
     $tries--; 
     sleep($retry_after); 
    } 
} 
1

Wie zuvor gesagt, ich entweder ein Problem mit dem Code sehen. Vielleicht sollten Sie aber erwägen, mehr Zeit für den Curl einzustellen - um sicher zu gehen, dass dieses langsam geladene Bild endlich geladen wird. Also, als eine Möglichkeit, versuchen Sie, CURLOPT_TIMEOUT auf seltsame große Zahl, sowie entsprechende Timeout für PHP-Skriptausführung zu erhöhen. Es kann helfen. Vielleicht ist die beste Variante, die vorherige Variante des Autors zu mischen.

1

Ich habe versucht, wget auf der Bild-URL und es lädt das Bild und dann scheint zu hängen - vielleicht schließt der Server die Verbindung nicht richtig.

Allerdings habe ich file_get_contents statt curl zu arbeiten, wenn das hilft:

<?php 
$image = 'http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard'; 
$imageData = base64_encode(file_get_contents($image)); 
$src = 'data: '.mime_content_type($image).';base64,'.$imageData; 
echo '<img src="',$src,'">'; 
1

Sind Sie sicher, dass es funktioniert nicht? Ihr Code funktioniert gut für mich (nach dem Hinzufügen des fehlenden Semikolons nach $image = ...).

Der Grund, warum es Ihnen Probleme geben könnte, ist, weil es kein Bild ist, es ist ein MJPEG. Es verwendet eine HTTP-Sitzung, die offen und mit einem mehrteiligen Inhalt (ähnlich wie in MIME-E-Mail) geöffnet ist, und der Server verschiebt einen neuen JPEG-Rahmen, um den letzten in einem Intervall zu ersetzen. CURL scheint glücklich zu sein und gibt dir nur den ersten Frame.

Verwandte Themen