2015-08-23 4 views
5

Я пытаюсь асинхронно загружать файлы с помощью Guzzle 6, но документация кажется туманной и не может найти полезных примеров.Как я могу асинхронно загружать файлы с помощью Guzzle 6?

Вещь, о которой я не уверен, - как я должен сохранять полученные данные?

В настоящее время я делаю это так:

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

Является ли это действительно асинхронный?

Поскольку, если мы входим в один обратный вызов и начинаем цикл, как мы можем получить данные из других одновременно?

Есть ли более прямой способ указать при создании запроса, где должен храниться ответ? (или напрямую передавая поток для этого).

ответ

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 
} 
Смежные вопросы