fsockopen用feof读取http响应内容的一些问题
2014-02-07 00:00
295 查看
在前面三个例子中,都有这么一段代码:
PHP 的 feof() 函数用于检测是否已到达文件末尾 (eof)。如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。
while (!feof($fp)) 即当文件指针没有达到 End Of File,就循环读入数据直至读完。这是一个常见用法,我们使用fsockopen打开一个$fp来发送http头,请求后用feof判断是否读完来获取服务器响应的内容。
但是这使用feof时要特别注意一点,php手册上关于feof有这样一个说明:
Warning:如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。
也就是一个打开的socket连接,没有在读完后关闭,feof会一直返回true直到超时。
看如下代码:
运行这代码就有问题了,while进入死循环,直到超时。因此,稍作改动,请求头部最后加上Connection:close,来告诉服务器响应完就断开。
while (!feof($fp)) { // 读取文件/数据 //$content .= fgets($fp, 128); //$line = fread($fp,4096); //$line = fputs($fp2,fgets($fp,128)); }
PHP 的 feof() 函数用于检测是否已到达文件末尾 (eof)。如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。
while (!feof($fp)) 即当文件指针没有达到 End Of File,就循环读入数据直至读完。这是一个常见用法,我们使用fsockopen打开一个$fp来发送http头,请求后用feof判断是否读完来获取服务器响应的内容。
但是这使用feof时要特别注意一点,php手册上关于feof有这样一个说明:
Warning:如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。
也就是一个打开的socket连接,没有在读完后关闭,feof会一直返回true直到超时。
看如下代码:
$url = "/test/index.php"; $fp = fsockopen('www.example.com',80,$errno,$errstr,10); if(!$fp) { die("Network error or invalid stock code\r\n"); } elseif($error) { die("$error:$errstr\r\n"); } else { $request = "GET $url HTTP/1.1\r\n"; $request .= "Host: www.example.com\r\n"; $request .= "Pragma: no-cache\r\n"; $request .= "Cache-Control: no-cache\r\n\r\n"; fwrite($fp,$request);//发送请求头 while(!feof($fp)) { $tmp .= fgets($fp,1024);//获取服务器返回信息 } //fclose($fp); }
运行这代码就有问题了,while进入死循环,直到超时。因此,稍作改动,请求头部最后加上Connection:close,来告诉服务器响应完就断开。
相关文章推荐
- fsockopen用feof读取http响应内容的一些问题
- JAVA发送HTTP请求(post、get),读取HTTP响应内容,实例及应用
- HttpClient发送请求后得到的响应内容出现部分乱码的问题
- 边读边计算的如果用计数器则可以指定读取第几行内容第一例(答复:咨询VB读文本文件,文本文件有N行,3列。想得到1、2列相同时。3列的值求和)http://bbs.csdn.net/topics/390
- Ext中ComboBox读取数据、显示数据出现的一些问题
- "无法为更新定位行。一些值可能已在最后一次读取后已更改。"问题的解决方案
- 从 http 升级到 https 过程中遇到的一些问题
- 问题:FileInputStream从文件中读取,FileOutputStream写入时会多写入内容
- HttpWebResponse returns 404 error(解决异常后读取后续数据的问题)
- ASP.NET访问网址并读取响应的内容
- WCF布署问题 :HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。
- response 设置http响应头控制浏览器禁止缓存当前文档内容
- feof()函数读取文件和EOF结束符标志问题
- (转)谈论 读取Excel丢失内容的问题
- 利用php unpack读取c struct的二进制数据,struct内存对齐引起的一些问题
- 压缩响应问题---HttpServletResponse对象增强
- 从 http 升级到 https 过程中遇到的一些问题
- 从数据库读取text属性数据,并比较内容是否相等的问题。
- 获取HttpURLConnection 响应体内容
- 关于Eclipse3.3中内容助手不是Alt+/的问题解答,以及它的一些其他新特性