2014-05-13 15 views
5

Abbiamo il permesso di copiare periodicamente un'immagine della webcam da un altro sito. Utilizziamo le funzioni di cURL altrove nel nostro codice, ma quando proviamo ad accedere a questa immagine, non siamo in grado di farlo.Impossibile immagine cURL. Non sai cosa fare

Non sono sicuro di cosa sta succedendo. Il codice che utilizziamo per molte altre funzioni CURL è in questo modo:

$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); 

Questo codice non funziona per il seguente URL (immagine webcam), che è accessibile in un browser dalla nostra posizione: http://island-alpaca.selfip.com:10202/SnapShotJPEG?Resolution=640x480&Quality=Standard

Quando eseguo un test cURL, sembra che si blocchi per la durata del timeout. $cURL_source non ha mai dati.

Ho provato altri esempi CURL online, ma senza risultati. Presumo che ci sia un modo per costruire la richiesta di curl per far funzionare tutto, ma niente di ciò che ho provato sembra portarmi da nessuna parte.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie

+1

Se lo apro nel browser, ci vuole anche per sempre, fino a quando la richiesta non riesce. Non penso che ci sia un modo per fare in modo che cUrl scarichi risorse irraggiungibili. Sceglierei una risorsa più stabile da testare.Quindi, prova a usare 'wget' o command line' curl' per vedere se il server può effettivamente raggiungerlo (potrebbe essere protetto da firewall). Se funziona, prova ad usare PHP. – GolezTrol

+0

se var_dump '$ cURL_source' cosa mostra? Hai provato 'curl_error ($ ch);' per vedere quale errore si presenta? – Javad

+0

GolezTrol, posso accedere all'URL in un browser. A volte ci vuole un po 'ma non sempre. @Javad $ cURL_source non ha mai nulla in esso e ottengo "impossibile connettersi all'host" da curl_error ($ ch) – edeneye

risposta

1

È possibile recuperare l'URL dal server su cui è in esecuzione questo codice? Forse ha regole firewall in atto? Stai recuperando da una porta non standard: 10202. Deve essere consentito dal tuo firewall.

Io, come gli altri, ho trovato facile recuperare l'immagine con curl/php.

+0

+1 per porta firewall –

3

Non vedo alcun problema con il codice. È possibile ottenere errore a volte a causa di diversi problemi con la rete. Puoi provare ad aspettare una buona risposta in loop per aumentare le possibilità di successo.

Qualcosa di simile:

$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

Come si diceva prima, posso né vedere alcun problema con il codice. Tuttavia, forse dovresti considerare di impostare più timeout per il ricciolo - per essere sicuro che questa immagine a caricamento lento venga finalmente caricata. Quindi, come possibilità, prova ad aumentare CURLOPT_TIMEOUT a un grande numero strano, così come il timeout corrispondente per l'esecuzione dello script php. Potrebbe essere d'aiuto Forse, la variante migliore è mescolare la variante dell'autore precedente e questa.

1

Ho provato wget sull'URL dell'immagine e scarica l'immagine e quindi sembra bloccarsi - forse il server non sta chiudendo correttamente la connessione.

Tuttavia ho avuto file_get_contents a lavorare piuttosto che curl, se questo aiuta:

<?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

Sei sicuro che non funziona? Il tuo codice funziona correttamente (dopo aver aggiunto il punto e virgola mancante dopo $image = ...).

La ragione potrebbe essere che ti dà problemi è perché non è in realtà un'immagine, è un MJPEG. Usa una sessione HTTP che viene mantenuta aperta e con un contenuto multipart (simile a quello che si vede nell'e-mail MIME), e il server spinge un nuovo frame JPEG per sostituire l'ultimo su un intervallo. CURL sembra essere felice di averti dato il primo frame.