zoukankan      html  css  js  c++  java
  • fsockopen与HTTP 1.1/HTTP 1.0

    在前面的例子中,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 />
    ";
        }
        $end = "
    ";
        $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 />
    ";
        }
    
        $end = "
    ";
        $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" 都必需。
  • 相关阅读:
    使用ansible 批量分发ssh密钥
    修改DNS
    如何使用openssl生成RSA公钥和私钥对
    压力测试 php-fpm 优化
    mysql 安装
    svn 权限配置
    powerdesigner导出word
    Mysql无法创建外键的原因
    office project 激活
    MySQL日志恢复误删记录
  • 原文地址:https://www.cnblogs.com/phpfensi/p/6927133.html
Copyright © 2011-2022 走看看