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 相关文章推荐
NO3第三帝国留言簿制作过程
Oct 09 PHP
PHP XML备份Mysql数据库
May 27 PHP
php中定义网站根目录的常用方法
Aug 08 PHP
php IP转换整形(ip2long)的详解
Jun 06 PHP
采用ThinkPHP中F方法实现快速缓存实例
Jun 13 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
php面向对象编程self和static的区别
May 08 PHP
Yii2表单事件之Ajax提交实现方法
May 04 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
PHP convert_cyr_string()函数讲解
Feb 13 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 图片上传类代码
2009/07/17 PHP
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
php 猴子摘桃的算法
2017/06/20 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
python机器学习之贝叶斯分类
2018/03/26 Python
代码详解django中数据库设置
2019/01/28 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
暑假实习求职信范文
2013/09/22 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
厉行节约工作总结
2015/08/12 职场文书
初中班长竞选稿
2015/11/20 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL