2015-08-23 16 views
5

Eşzamansız olarak Guzzle 6 dosyalarını indirmeye çalışıyorum, ancak belgeler belirsiz görünüyor ve kullanışlı örnekler bulamadınız.Guzzle 6 ile nasıl eşzamansız dosyaları indirebilirim?

Bundan emin olmadığım şey - alınan verileri nasıl kaydedeceğim?

Şu anda böyle yapıyorum:

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

bu gerçekten asenkron mi?

Bir geri arama içine girip döngü oluşturmaya başlayacağımıza göre, diğer yandan verileri aynı anda nasıl alabiliriz?

Bir İstek oluştururken, yanıtın nereye kaydedilmesi gerektiğini söylemenin daha doğrudan bir yolu var mı? (ya da bunun için doğrudan bir akış geçirerek). Başvuru için

$client->request('GET', '/stream/20', [ 
    'sink' => '/path/to/file', 
]); 

, http://docs.guzzlephp.org/en/latest/request-options.html#sink bkz:

cevap

7

sink seçeneğinin burada arkadaşın olmalıdır.

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 
} 
İlgili konular