4

这是我的代码

 $url = "partial_response.php";
 $sac_curl = curl_init();
 curl_setopt($sac_curl, CURLOPT_HTTPGET, true);
 curl_setopt($sac_curl, CURLOPT_URL, $url);
 curl_setopt($sac_curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($sac_curl, CURLOPT_HEADER, false);
 curl_setopt($sac_curl, CURLOPT_TIMEOUT, 11);
 $resp = curl_exec($sac_curl); 
 curl_close($sac_curl);
 echo $resp;

Partial_response.php

header( 'Content-type: text/html; charset=utf-8' );
echo 'Job waiting ...<br />';
for( $i = 0 ; $i &#60; 10 ; $i++ )
{
echo $i . '<br/>';
flush();
ob_flush();
sleep(1);
}
echo 'End ...<br/>';

从 about 代码中,我试图从 partial_response.php 获得部分响应。我想要的是,我需要 curl 单独返回“作业等待..”,而不是等待 partial_response.php 完成循环并返回整个数据。因此,当我将 CURLOPT_TIMEOUT 减少到 11 以下时,我根本没有得到任何响应。请澄清我的疑问。提前致谢。

4

3 回答 3

2

后来我意识到cURL不能做我想要的,我曾经 stream_context_get_options 达到我想要的。在这里,http://www.php.net/manual/en/function.stream-context-get-options.php

于 2013-08-21T13:15:43.860 回答
1

不,恐怕不会。至少我不知道,这仅仅是因为 PHP 是一种同步语言,这意味着您不能“跳过”任务。(即curl_exec()总是——无论如何——在请求完成之前执行)

于 2013-05-14T15:50:44.797 回答
1

我不确定是否超时,但您可以通过使用 CURLOPT_WRITEFUNCTION 标志使用 cURL 获得部分响应:

curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);

Curl 处理程序在哪里$ch,并且$callback是回调函数名称。此命令将从远程站点流式传输响应数据。回调函数可能类似于:

$result = '';
$callback = function ($ch, $str) {
    global $result;
    //$str has the chunks of data streamed back. 
    $result .= $str;
    // here you can mess with the stream data either with $result or $str.
    // i.e. look for the "Job waiting" string and terminate the response.
    return strlen($str);//don't touch this
};

如果最后没有中断,$result将包含来自远程站点的所有响应。

所以结合一切看起来像:

$result = '';
$callback = function ($ch, $str) {
    global $result;
    //$str has the chunks of data streamed back. 
    $result .= $str;
    // here you can mess with the stream data either with $result or $str.
    // i.e. look for the "Job waiting" string and terminate the response.
    return strlen($str);//don't touch this
};

$url = "partial_response.php";
$sac_curl = curl_init();
curl_setopt($sac_curl, CURLOPT_HTTPGET, true);
curl_setopt($sac_curl, CURLOPT_URL, $url);
curl_setopt($sac_curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($sac_curl, CURLOPT_HEADER, false);
curl_setopt($sac_curl, CURLOPT_TIMEOUT, 11);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);
curl_exec($sac_curl); // the response is now in $result.
curl_close($sac_curl);
echo $result;
于 2020-05-08T10:48:10.400 回答