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 相关文章推荐
文件上传类
Oct 09 PHP
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
PHP 魔术函数使用说明
May 14 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
php下拉选项的批量操作的实现代码
Oct 14 PHP
php网页病毒清除类
Dec 08 PHP
PHP连接操作access数据库实例
Mar 30 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
Laravel实现ApiToken认证请求
Oct 14 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下使用SMTP发邮件的代码
2008/01/10 PHP
Yii2单元测试用法示例
2016/11/12 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
Three.js基础学习教程
2017/11/16 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
总结Python编程中函数的使用要点
2016/03/20 Python
python爬虫之百度API调用方法
2017/06/11 Python
彻底搞懂Python字符编码
2018/01/23 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
大学毕业生个人自荐信范文
2014/01/08 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
投标承诺函格式
2015/01/21 职场文书
党员活动总结
2015/02/04 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技