• fsockopen与HTTP 1.1/HTTP 1.0

    一些使用上的区别
    服务器君一共花费 18.653 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    在前面的例子中,HTTP请求信息头有些指定了 HTTP 1.1,有些指定了 HTTP/1.0,有些又没有指定,那么他们之间有什么区别呢?

    关于HTTP 1.1与HTTP 1.0的一些基本情况,可以参考下 HTTP 1.1的详细介绍

    我们先来看一下 fsockopen 不指定 HTTP 的情况:

    function asyn_sendmail()
    {
        $ip = '121.199.24.143';
        $url = '/php/sock.php';
        $fp = fsockopen($ip, 80, $errno, $errstr, 5);
        if (!$fp)
        {
            echo "$errstr ($errno)<br />\n";
        }
        $end = "\r\n";
        $input = "GET $url$end";
        $input.="$end";
        fputs($fp, $input);
        $html = '';
        while (!feof($fp))
        {
            $html.=fgets($fp);
        }
        fclose($fp);
        writelog($html);
        echo $html;
    }
    function writelog($message)
    {
        $path = 'F:\log2.txt';
        $handler = fopen($path, 'w+b');
        if ($handler)
        {
            $success = fwrite($handler, $message);
            fclose($handler);
        }
    }
    asyn_sendmail();
    

    sock.php:

    <?php
        echo "Welcome to NowaMagic";
    ?> 
    

    程序输出:

    Welcome to NowaMagic
    

    log2.txt 内容也是:

    Welcome to NowaMagic
    

    那些接下来再看看在标头加上 HTTP 1.1 的程序:

    function asyn_sendmail()
    {
        $ip = '121.199.24.143';
        $url = '/php/sock.php';
        $fp = fsockopen($ip, 80, $errno, $errstr, 5);
        if (!$fp)
        {
            echo "$errstr ($errno)<br />\n";
        }
    
        $end = "\r\n";
        $input = "GET $url HTTP/1.1$end";
        //如果不加下面这一句,会返回一个http400错误       
    	$input.="Host: $ip$end";    
    	//如果不加下面这一句,请求会阻塞很久      
    	$input.="Connection: Close$end";     $input.="$end";
        fputs($fp, $input);
        $html = '';
        while (!feof($fp))
        {
            $html.=fgets($fp);
        }
        fclose($fp);
        writelog($html);
        echo $html;
    }
    
    function writelog($message)
    {
        $path = 'F:\log.txt';
        $handler = fopen($path, 'w+b');
        if ($handler)
        {
            $success = fwrite($handler, $message);
            fclose($handler);
        }
    }
    asyn_sendmail();
    

    程序输出:

    HTTP/1.1 200 OK
    Date: Fri, 07 Feb 2014 13:50:14 GMT
    Server: Apache/2.2.3 (CentOS)
    X-Powered-By: PHP/5.3.3
    Vary: Accept-Encoding
    Content-Length: 21
    Connection: close
    Content-Type: text/html; charset=UTF-8
    
    Welcome to NowaMagic 
    

    留意到注释:

    //如果不加下面这一句,请求会阻塞很久      
    $input.="Connection: Close$end";     $input.="$end";
    

    原因是什么呢? 可以参考 fsockopen用feof读取http响应内容的一些问题

    //如果不加下面这一句,会返回一个http400错误       
    $input.="Host: $ip$end";    
    

    报400错误:

    HTTP/1.1 400 Bad Request
    Date: Fri, 07 Feb 2014 13:54:57 GMT
    Server: Apache/2.2.3 (CentOS)
    Content-Length: 305
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    

    使用http1.1连接,要加上Host请求表头。

    小结:

    • HTTP 1.0, Apache Web 服务器中 $input.="Connection: Close$end"; 与 $input.="Connection: Close$end" 可都不需要。
    • HTTP 1.0, Nginx Web 服务器中 $input.="Connection: Close$end"; 与 $input.="Connection: Close$end" 都必需。
    • HTTP 1.1, Apache Web 服务器中 $input.="Connection: Close$end"; 必须要,$input.="Connection: Close$end" 可不用。
    • HTTP 1.1, Nginx Web 服务器中 $input.="Connection: Close$end"; 与 $input.="Connection: Close$end" 都必需。
更多 推荐条目

Welcome to NowaMagic Academy!

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

本章最新发布
随机专题
  1. [Python程序设计] Tornado源码解析 23 个条目
  2. [数据库技术] MySQL常用自带函数 3 个条目
  3. [数据库技术] MySQL中英文混合排序 4 个条目
  4. [PHP程序设计] htaccess 设置技巧 6 个条目
  5. [移动开发] Android加载器Loaders 5 个条目
  6. [PHP程序设计] 对输入文件类型的检测 1 个条目
  7. [PHP程序设计] PHP数组探索 4 个条目
  8. [PHP程序设计] PHP扩展模块安装 1 个条目
  9. [软件工程与项目管理] 了解一点WebKit 9 个条目
  10. [PHP程序设计] PHP数组的遍历 7 个条目
  11. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
  12. [Python程序设计] Tornado背景知识介绍 4 个条目
窗口 -- [博客]