PHP使用socket发送HTTP请求的方法


Posted in PHP onFebruary 14, 2016

本文实例讲述了PHP使用socket发送HTTP请求的方法。分享给大家供大家参考,具体如下:

socket方式

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0));
socket_connect($socket, 'www.baidu.com', 80);
//里面的换行代表 \r\n 注意拷贝的代码后面可能有空格
$http = <<<eof
GET / HTTP/1.0
Accept: */*
User-Agent: Lowell-Agent
Host: www.baidu.com
Connection: Close
eof;
socket_write($socket, $http, strlen($http));
while($str = socket_read($socket, 1024))
{
  echo $str;
}
socket_close($socket);

fsockopen方式

$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br />\n";
} else {
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: www.baidu.com\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $http);
  while (!feof($fp)) {
    echo fgets($fp, 128);
  }
  fclose($fp);
}

原始socket方式

$fp = stream_socket_client("tcp://www.baidu.com:80", $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br />\n";
} else {
  $http = <<<eof
GET / HTTP/1.0
Accept: */*
User-Agent: Lowell-Agent
Host: www.baidu.com
Connection: Close
eof;
  fwrite($fp, $http);
  while (!feof($fp)) {
    echo fgets($fp, 1024);
  }
  fclose($fp);
}

stream  方式(get):

$http = <<<eof
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Cookie: BAIDUID=79D98B1AD8436C57B967E111E484F1CD:FG=1; BDUSS=lF-UFFOanFPVG92NmF4U3NiTEoxOFh4YVBCTnZaMUtoTUNhZmxrWThwN25IaUJVQVFBQUFBJCQAAAAAAAAAAAEAAADzo1gKc2lxaW5pYW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeR-FPnkfhTU; BAIDUPSID=79D98B1AD8436C57B967E111E484F1CD; BD_UPN=13314352; BD_HOME=1; H_PS_PSSID=10047_1435_10874_10212_10501_10496_10753_10796_10219_10355_10666_10597_10095_10658_10442_10700_10460_10360_10618; sug=3; sugstore=0; ORIGIN=2; bdime=0
Connection: keep-alive
Cache-Control: max-age=0
eof;
$hdrs = array(
    'http' =>array(
        'header' => $http,
        'timeout'=>1, //超时 秒
        'method' => 'GET', //默认方式
 'protocol_version' => '1.1', //默认为 1.0
    ),
);
//参数格式参考 http://php.net/manual/zh/context.http.php
//curl方式的格式可以参考; http://php.net/manual/zh/context.curl.php
$context = stream_context_create($hdrs);
echo file_get_contents('http://www.baidu.com', 0, $context);

stream  方式 post:

$postdata = http_build_query(array('act'=>'save', 'id'=>387171));
$http = <<<eof
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Cookie: BAIDUID=79D98B1AD8436C57B967E111E484F1CD:FG=1; BDUSS=lF-UFFOanFPVG92NmF4U3NiTEoxOFh4YVBCTnZaMUtoTUNhZmxrWThwN25IaUJVQVFBQUFBJCQAAAAAAAAAAAEAAADzo1gKc2lxaW5pYW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeR-FPnkfhTU; BAIDUPSID=79D98B1AD8436C57B967E111E484F1CD; BD_UPN=13314352; BD_HOME=1; H_PS_PSSID=10047_1435_10874_10212_10501_10496_10753_10796_10219_10355_10666_10597_10095_10658_10442_10700_10460_10360_10618; sug=3; sugstore=0; ORIGIN=2; bdime=0
Connection: keep-alive
Cache-Control: max-age=0
eof;
#注意post方式需要增加Content-Type
$hdrs = array(
    'http' =>array(
        'header' => $http,
        'timeout'=>1, //超时 秒
        'method' => 'POST',
        'content' => $postdata,
 'protocol_version' => '1.1', //默认为 1.0
    ),
);
//参数格式参考 http://php.net/manual/zh/context.http.php
//curl方式的格式可以参考; http://php.net/manual/zh/context.curl.php
$context = stream_context_create($hdrs);
echo file_get_contents('http://test.cm/song.php', 0, $context);

注意:http1.1 中必须包含 Host 头, 而 http1.0中则可以没有

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php htmlspecialchars加强版
Feb 16 PHP
PHP rawurlencode与urlencode函数的深入分析
Jun 08 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
php中rename函数用法分析
Nov 15 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
PHP 的比较运算与逻辑运算详解
May 12 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
PHP闭包函数详解
Feb 13 #PHP
php设计模式之委托模式
Feb 13 #PHP
PHP常用设计模式之委托设计模式
Feb 13 #PHP
php判断邮箱地址是否存在的方法
Feb 13 #PHP
php打包网站并在线压缩为zip
Feb 13 #PHP
php session 写入数据库
Feb 13 #PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 #PHP
You might like
php不用正则验证真假身份证
2013/11/06 PHP
php使用数组填充下拉列表框的方法
2015/03/31 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python流程控制 while循环实现解析
2019/09/02 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
介绍一下gcc特性
2015/10/31 面试题
道德模范先进事迹
2014/02/14 职场文书
质量月活动策划方案
2014/03/10 职场文书
读书活动总结
2014/04/28 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android