是否可以使用PHP cURL获得部分响应?
这是我的密码是否可以使用PHP cURL获得部分响应?,php,curl,Php,Curl,这是我的密码 $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
$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 < 10 ; $i++ )
{
echo $i . '<br/>';
flush();
ob_flush();
sleep(1);
}
echo 'End ...<br/>';
标题('Content-type:text/html;charset=utf-8');
回显“等待作业…”;
对于($i=0;$i<;10;$i++)
{
回显$i。“
”;
冲洗();
ob_flush();
睡眠(1);
}
回显“结束…
”;
从about代码中,我试图从partial_response.php获得部分响应。我想要的是,我需要curl单独返回“Job waiting..”而不是等待partial_response.php完成循环并返回整个数据。因此,当我将CULLOPT_超时减少到11以下时,我根本没有得到任何响应。请澄清我的疑问。
提前谢谢。不,恐怕不行。至少据我所知,这只是因为PHP是一种同步语言,这意味着不能“跳过”任务。(也就是说,
curl\u exec()
在请求完成之前,无论发生什么,都将一直执行)我后来意识到curl不能做我想做的事情,我使用了stream\u context\u get\u选项
实现我想要的。这里是,.我不确定是否超时,但您可以使用cURL通过使用CURLOPT_WRITEFUNCTION标志获得部分响应:
curl\u setopt($ch,CURLOPT\u WRITEFUNCTION,$callback);
其中,$ch
是Curl处理程序,$callback
是回调函数名。此命令将从远程站点传输响应数据。回调函数可以类似于:
$result='';
$callback=函数($ch,$str){
全球$结果;
//$str将数据块流回。
$result.=$str;
//在这里,您可以使用$result或$str处理流数据。
//即,查找“Job waiting”字符串并终止响应。
return strlen($str);//不要碰这个
};
如果未在末尾中断,$result
将包含来自远程站点的所有响应
因此,将所有内容组合在一起将类似于:
$result='';
$callback=函数($ch,$str){
全球$结果;
//$str将数据块流回。
$result.=$str;
//在这里,您可以使用$result或$str处理流数据。
//即,查找“Job waiting”字符串并终止响应。
return strlen($str);//不要碰这个
};
$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);//现在以$result作为响应。
卷曲关闭($sac\u curl);
回声$结果;
那很好,有人能告诉我有没有其他方法可以用php解决这个问题?这不是真的。Curl以迭代的顺序获取数据,每个迭代都返回一定数量的数据(如果您考虑抓取大文件/页面,这一点就很明显)。您可以使用CURLOPT\u WRITEFUNCTION
保存请求中的部分数据。我想问题不在于获取响应的末尾,而在于发送响应的末尾。我认为,由于您的Partial_response.php
在其执行结束时发送数据,因此您永远不会在较低的超时时间内获得数据(它没有到达它的结尾,因此数据不会被发送)。尝试单独使用flush()
函数或与CURLOPT\u WRITEFUNCTION
结合使用以接收部分输出。这不是答案,请解释如何使用stream\u context\u get\u选项解决此问题