在前面的例子中,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" 都必需。

最新文章

  1. quartz.net 时间表达式----- Cron表达式详解
  2. 我了个大擦-PDO(二)
  3. Python 集合操作
  4. 使用递归方法实现,向FTP服务器上传整个目录结构、从FTP服务器下载整个目录到本地的功能
  5. jdk5下载链接
  6. nginx负载均衡 - session失效
  7. NOIP2013 花匠 DP 线段树优化
  8. 查看Oracle数据库被锁住的表,删除锁表的进程
  9. 如何将你牛逼的iOS代码分享到CocoaPod(转)
  10. spring Annotation 笔记2.1
  11. linux kill杀死进程
  12. 仿淘宝购物车demo---增加和减少商品数量
  13. MySQL:windows中困扰着我们的中文乱码问题
  14. koa/redux middleware 深入解析
  15. Xamarin.Android 无法检索到 Resource 问题
  16. echarts3地图如何添加点击事件? 点击地图相应的区域ajax获取并展示本区域省下面所有市的信息
  17. [CodeForces_618C]Constellation
  18. MyBatis关联查询,一对一关联查询
  19. Application 应用对象
  20. mysql 5.7新特新

热门文章

  1. 程序员这十个java题你都会吗?
  2. WebGL简易教程(十二):包围球与投影
  3. [考试反思]0825NOIP模拟测试30:没落
  4. 帝国cms7.5免登陆发布模块
  5. len、is、==、可变于不可变类型
  6. aop的简单使用(代码和配置记录)
  7. Java虚拟机-字节码指令
  8. MySQL开发规范与使用技巧总结
  9. 力扣(LeetCode)最后一个单词的长度 个人题解
  10. mysql清空数据库下所有的表