9

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

这真的是异步的吗?

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

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

4

2 回答 2

15

sink选项应该是您的朋友:

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

如需参考,请参阅http://docs.guzzlephp.org/en/latest/request-options.html#sink

于 2015-12-22T23:43:46.750 回答
4
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
}
于 2017-03-21T15:20:21.933 回答