fsockopen中用feof判断读取http响应内容

五 31st, 2009

我们通常使用fsockopen打开一个$fp来发送http头,请求后用feof判断是否读完来获取服务器响应的内容。
但是这使用feof时要特别注意一点,php手册上关于feof有这样一个说明:

Warning
如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。

也就是一个打开的socket连接,没有在读完后关闭,feof会一直返回true直到超时
看如下代码:

$url = "/N_StockQuote.aspx?StockCode=002024&StockMarket=2";
$fp = fsockopen('hqdigi.eastmoney.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: hqdigi.eastmoney.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);//获取服务器返回信息
 }
}

运行这代码就有问题了,while进入死循环,直到超时

因此,稍作改动,请求头部最后加上Connection:close,来告诉服务器,响应完就断开

标签:
  1. admin
    六 18th, 200911:49

    自己坐沙发

  2. kevin
    九 22nd, 200917:57

    php作http request还是使用curl模块可靠性比较高

  3. phpman
    九 23rd, 200912:29

    yeah,CURL是封装了一下,比较方便。

;) :| :x :twisted: :roll: :oops: :o :mrgreen: :lol: :idea: :evil: :cry: :arrow: :P :D :?: :? :) :( :!: 8O 8)

Spam Protection by WP-SpamFree