PHP的fsockopen总是等待60秒才返回结果的问题总结

使用fsockopen去连接一个url,并模拟提交表单,贴下主要代码:


$urlArray = parse_url ( $this->url );
$fp = fsockopen ( $urlArray ['host'], $this->port );
$requestData = $this->buildRequest ();
fwrite ( $fp, $requestData );
$content = "";
while ( $data = fread ( $fp, 4096 ) ) {
    $content .= $data;
}
fclose ( $fp );
$this->response = trim ( stristr ( $content, "\r\n\r\n" ), "\r\n" );

结果总是要等待一分钟才返回,无论什么情况下总是等待60秒,不多不少,于是逐行debug,发现问题出在

while ( $data = fread ( $fp, 4096 ) ) {
	$content .= $data;
}
这里,等待就发生这个fread里面。


查了很多资料,找到解决办法:


while(!feof($fp)){
			stream_set_timeout($fp, 2);
			$content .= fread($fp, 1024);
			$info = stream_get_meta_data($fp);
			if ($info['timed_out']) {
			  break;
			}
		 }



相关说明:

提示和注释

  提示:feof() 函数对遍历长度未知的数据很有用。
  注意:如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。
  注意:如果传递的文件指针无效可能会陷入无限循环中,因为 EOF 不会返回 TRUE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值