我正在尝试用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
}