如何使用Guzzle 6异步下载文件?


How can I asynchronously download files with 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);
};

这真的是异步吗?

因为如果我们进入一个回调并开始循环,我们如何同时从其他回调中获取数据?

是否有更直接的方法来告诉,当创建一个请求,响应应该存储在哪里?(或者直接传递一个流)。

sink选项在这里应该是您的朋友:

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

参考:http://docs.guzzlephp.org/en/latest/request-options.html#sink

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
}