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

    一些需要注意的细节
    服务器君一共花费 9.059 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的
    1. Chapter:

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

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

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] PHP数组的遍历 7 个条目
  2. [Python程序设计] Python Web部署的背景知识 9 个条目
  3. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  4. [Python程序设计] Tornado源码解析 23 个条目
  5. [移动开发] 从代码角度去认识 Handler 4 个条目
  6. [计算机算法] 从双端队列引出的卡特兰数 3 个条目
  7. [移动开发] Android Studio的使用技巧 4 个条目
  8. [软件工程与项目管理] 开始了解Git 5 个条目
  9. [Python程序设计] Django架构流程分析 7 个条目
  10. [PHP程序设计] fsockopen,curl与file_get_contents 12 个条目
  11. [软件工程与项目管理] 浏览器初步介绍 8 个条目
  12. [智力开发与知识管理] 学习编程为什么没会这么难? 7 个条目
窗口