2015-08-23 9 views
5

Sto provando a scaricare i file in modo asincrono con Guzzle 6, ma la documentazione sembra vaga e non ho trovato alcun esempio utile.Come posso scaricare i file in modo asincrono con Guzzle 6?

La cosa di cui non sono sicuro è: come posso salvare i dati ricevuti?

Attualmente sto facendo in questo modo:

$successHandler = function (Response $response, $index) use ($files) { 
    $file = fopen($files[$index], 'a'); 
    $handle = $response->getBody(); 

    while (!$handle->eof()) { 
     fwrite($file, $handle->read(2048)); 
    } 

    fclose($file); 
}; 

è davvero questo asincrono?

Poiché se entriamo in un callback e si avvia il ciclo, come possiamo ottenere i dati dagli altri allo stesso tempo?

C'è un modo più diretto per dire, quando si crea una richiesta, dove deve essere memorizzata la risposta? (o passando direttamente un flusso per quello).

risposta

0
use function GuzzleHttp\Psr7\stream_for; 
use GuzzleHttp\RequestOptions; 
use GuzzleHttp\Client; 

$tmpFile = tempnam(sys_get_temp_dir(), uniqid(strftime('%G-%m-%d'))); 
$resource = fopen($tmpFile, 'w'); 
$stream = stream_for($resource); 

$client = new Client(); 
$options = [ 
    RequestOptions::SINK   => $stream, // the body of a response 
    RequestOptions::CONNECT_TIMEOUT => 10.0, // request 
    RequestOptions::TIMEOUT   => 60.0, // response 
]; 

$response = $client->request('GET', 'https://github.com/robots.txt', $options); 

$stream->close(); 
fclose($resource); 

if ($response->getStatusCode() === 200) { 
    echo file_get_contents($tmpFile); // content 
} 
Problemi correlati