使用Guzzle

时间:2018-10-22 10:08:28

标签: php curl guzzle

使用php调用curl时,我可以在CURLOPT_PROGRESSFUNCTION上挂接回调,并在请求过程中使用curl_multi_getcontent($handle)读取标头

$handle = curl_init()
curl_setopt(CURLOPT_NOPROGRESS, false)
curl_setopt(CURLOPT_RETURNTRANSFER, true)
curl_setopt(CURLOPT_PROGRESSFUNCTION, function($handle) {
   $response = curl_multi_getcontent($handle);
   // some logic here
})
curl_exec($handle)

如何用Guzzle做到这一点?

问题在于,如果不将curl_multi_getcontent($handle)设置为CURLOPT_RETURNTRANSFER,我将无法使用true

但是当我将CURLOPT_RETURNTRANSFER设置为“狂饮”的curl配置时,我可以读取进度函数中的标头$response = curl_multi_getcontent($handle);。但是,响应流包含空内容。

$request->getResponse()->getBody()->getContents(); // always outputs ""

编辑: 我进行了此更改https://github.com/guzzle/guzzle/pull/2173,因此可以使用进度设置访问进行中的​​句柄回调:

'progress' => function($handle) {
   $response = curl_multi_getcontent($handle);
   // some logic here
})

只要CURLOPT_RETURNTRANSFERtrue,它就可以工作。但是,正如我前面提到的,响应内容为""

2 个答案:

答案 0 :(得分:0)

有进度请求选项。

// Send a GET request to /get?foo=bar
$result = $client->request(
    'GET',
    '/',
    [
        'progress' => function(
            $downloadTotal,
            $downloadedBytes,
            $uploadTotal,
            $uploadedBytes
        ) {
            //do something
        },
    ]
);

http://docs.guzzlephp.org/en/stable/request-options.html#progress

答案 1 :(得分:0)

我找到了解决方案,或者只是解释了为什么发生这种情况。

默认情况下,当未定义自定义接收器时(或定义了接收器但实际上并不重要时),CURLOPT_FILE会设置CURLOPT_WRITEFUNCTION选项。

但是,将CURLOPT_RETURNTRANSFER设置为true会使这两个选项无效->它们不再适用。

设置CURLOPT_RETURNTRANSFER之后发生两件事:

  1. 可以使用PROGRESSFUNCTION$response = curl_multi_getcontent($handle)中读取响应。为此,必须进行https://github.com/guzzle/guzzle/pull/2173
  2. 当Guzzle调用curl_exec($handle)作为此调用的返回值时,将返回响应。但是Guzzle不会将其分配给任何变量,因为它期望响应不会通过WRITEFUNCTION返回,而是通过CURLOPT_RETURNTRANSFER被设置为php://temp抵消。

所以我的解决方案不是最干净的,但是我找不到其他方法来解决Guzzle。食尸鬼根本就没有能力去应付。

我叉了嘴。然后创建行为类似于默认接收器->的自定义Stream类,该类写入curl_exec。当我的自定义Stream类设置为接收器时,我将$result = curl_exec($easy->handle); $easy->sink->write($result); 的结果写入流中:

${!col1}