使用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_RETURNTRANSFER
是true
,它就可以工作。但是,正如我前面提到的,响应内容为""
。
答案 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
之后发生两件事:
PROGRESSFUNCTION
在$response = curl_multi_getcontent($handle)
中读取响应。为此,必须进行https://github.com/guzzle/guzzle/pull/2173 curl_exec($handle)
作为此调用的返回值时,将返回响应。但是Guzzle不会将其分配给任何变量,因为它期望响应不会通过WRITEFUNCTION
返回,而是通过CURLOPT_RETURNTRANSFER
被设置为php://temp
抵消。所以我的解决方案不是最干净的,但是我找不到其他方法来解决Guzzle。食尸鬼根本就没有能力去应付。
我叉了嘴。然后创建行为类似于默认接收器->的自定义Stream类,该类写入curl_exec
。当我的自定义Stream类设置为接收器时,我将$result = curl_exec($easy->handle);
$easy->sink->write($result);
的结果写入流中:
${!col1}