php fsockopen模拟GET或POST请求
时间:2016-09-08
PHP关于socket编程的一个典型应用就是使用fsockopen模拟GET或POST提交,本文章向大家介绍php使用fsockopen函数发送post,get请求获取网页内容的方法,需要的朋友可以参考一下。
fsockopen是PHP提供的一个网络函数,用于打开打开一个网络连接或者一个Unix套接字连接。这是一种比较底层的写法,甚至fsockopen 返回的是没有处理过的数据,包括数据的长度数据内容和数据的结束符。而cURL系列函数就好用的多。CURL还会自动对DNS信息进行缓存,效率更高。偏底层的东西肯定更强大,学习成本更高。
使用fsockopen可以编写socket程序, fsockopen执行后返回的是文件指针,所以文件相关函数fgets()、fgetss()、fputs()、fclose() 与 feof(),尽情用吧,相信初学者,都会被它拼接http header恶心了吧。
下面向大家介绍fsockopen的基本语法:
resource fsockopen(string $hostname [,int $port = -1 [, int &$errno [,string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
启动一个套接字连接到指定的主机的资源,php支持在互联网领域的目标和unix在所支持的套接字传输列表说明,所支持的传输列表也可以检索使用stream_get_transports().
该插座预设会被启用,阻塞模式,你可以切换到非阻塞模式使用stream_set_blocking()。
1、fsockopen模拟GET:
$fp = fsockopen("www.manongjc.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno) ";
} else {
$out = "get / http/1.1 ";
$out .= "host: www.manongjc.com";
$out .= "connection: close ";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
2、fsockopen模拟post:
$post =1;
$url = parse_url($url);
$host ='http://www.manongjc.com';
$path ='/';
$query ='?action=phpfensi.com';
$port =80;
if($post) {
$out = "post $path http/1.0 ";
$out .= "accept: */* ";
//$out .= "referer: $boardurl ";
$out .= "accept-language: zh-cn ";
$out .= "content-type: application/x-www-form-urlencoded ";
$out .= "user-agent: $_server[http_user_agent] ";
$out .= "host: $host ";
$out .= 'content-length: '.strlen($post)." ";
$out .= "connection: close ";
$out .= "cache-control: no-cache ";
$out .= "cookie: $cookie ";
$out .= $post;
} else {
$out = "get $path http/1.0 ";
$out .= "accept: */* ";
//$out .= "referer: $boardurl ";
$out .= "accept-language: zh-cn ";
$out .= "user-agent: $_server[http_user_agent] ";
$out .= "host: $host ";
$out .= "connection: close ";
$out .= "cookie: $cookie ";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp)
{
return '';//note $errstr : $errno
} else {
return '成功访问';
}
3、封装好的fsockopen函数实现POST、GET请求
function http_request($url, $method = 'GET', $postfields = NULL, $headers = array()) {
$parse = parse_url($url);
isset($parse['host']) ||$parse['host'] = '';
isset($parse['path']) || $parse['path'] = '';
isset($parse['query']) || $parse['query'] = '';
isset($parse['port']) || $parse['port'] = '';
$path = $parse['path'] ? $parse['path'].($parse['query'] ? '?'.$parse['query'] : '') : '/';
$host = $parse['host'];
//协议
if ($parse['scheme'] == 'https') {
$version = '1.1';
$port = empty($parse['port']) ? 443 : $parse['port'];
$host = 'ssl://'.$host;
} else {
$version = '1.0';
$port = empty($parse['port']) ? 80 : $parse['port'];
}
//Headers
$headers[] = "Host: {$parse['host']}";
$headers[] = 'Connection: Close';
$headers[] = "User-Agent: $_SERVER[HTTP_USER_AGENT]";
$headers[] = 'Accept: */*';
//包体信息
if ($method == 'POST') {
if(is_array($postfields)){
$postfields = http_build_query($postfields);
}
$headers[] = "Content-type: application/x-www-form-urlencoded";
$headers[] = 'Content-Length: '.strlen($postfields);
$out = "POST $path HTTP/$version\r\n".join("\r\n", $headers)."\r\n\r\n".$postfields;
} else {
$out = "GET $path HTTP/$version\r\n".join("\r\n", $headers)."\r\n\r\n";
}
//发送请求
$limit = 0;
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) {
exit('Failed to establish socket connection: '.$url);
} else {
$header = $content = '';
//集阻塞/非阻塞模式流,$block==true则应用流模式
stream_set_blocking($fp, true);
//设置流的超时时间
stream_set_timeout($fp, 30);
fwrite($fp, $out);
//从封装协议文件指针中取得报头/元数据
$status = stream_get_meta_data($fp);
if (!$status['timed_out']) { //未超时
while (!feof($fp)) {
$header .= $h = fgets($fp);
if ($h && ($h == "\r\n" || $h == "\n")) break;
if (strpos($h, 'Content-Length:') !== false) {
$limit = intval(substr($header, 15));
}
}
$stop = false;
while (!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$content .= $data;
if ($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
fclose($fp);
//unchunk
$content = preg_replace_callback(
'/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'.
'((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',
create_function(
'$matches',
'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];'
),
$content
);
return $content;
}
}
- DeepMind 开源基于 MuJoCo 物理引擎强化学习工具 Control Suite
- hadoop常用的基本命令,HIVE复制文件,修改文件名
- gc服务器慢的原因分析 (r6笔记第14天)
- AI 玩微信跳一跳的正确姿势——跳一跳 Auto-Jump 算法详解
- 干货 | 深入理解Python装饰器
- 11g dataguard使用总结(r5笔记第12天)
- centos7.4下配置django+uwsgi+nginx
- 11g rac配置scan ip(r6笔记第30天)
- 【C++概念】---vector用法
- 浅谈Orabbix监控指标(r6笔记第27天)
- Orabbix定制监控Oracle的简单配置(r6笔记第26天)
- 【java基础】 线程实例
- 记一次数据库的分析和优化建议(r6笔记第24天)
- linux (ubantu)安装最新版python3.6,以及直接安装anaconda
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- PHP入门之流程控制
- 常用进制转换方法(取商留余)原理解析, 附基于栈实现进制转换的代码
- 用 jdom 解析 xml 文件时如何解决中文问题?如何解析?
- PHP入门之函数
- spring boot 启动报错 org/springframework/core/ErrorCoded
- PHP入门之数组
- PHP基础之排序
- 关于mysql limit offset的一点优化
- PHP基础之查找
- PHP木马免杀的一些总结
- PHP基础之面向对象篇
- PHP变量覆盖漏洞小结
- 算法复习 : 插入排序原理,记忆,时间复杂度 (7行java实现)
- PHP代码审计01之in_array()函数缺陷
- 分治思想 : 并归排序与其时间复杂度