fsockopen用feof读取http响应内容的一些问题

在前面三个例子中,都有这么一段代码:

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,来告诉服务器响应完就断开。

转载于:https://www.cnblogs.com/phpfensi/p/6927124.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值