PHP使用stream_context_create()模拟POST/GET请求的方法


Posted in PHP onApril 02, 2016

本文实例讲述了PHP使用stream_context_create()模拟POST/GET请求的方法。分享给大家供大家参考,具体如下:

有时候,我们需要在服务器端模拟 POST/GET 等请求,也就是在 PHP 程序中去实现模拟,改怎么做到呢?或者说,在 PHP 程序里,给你一个数组,如何将这个数组 POST/GET 到另外一个地址呢?当然,使用 CURL 很容易办到,那么如果不使用 CURL 库,又该怎么办呢?其实,在 PHP 里已经有相关的函数实现了,这个函数就是接下来要讲的 stream_context_create()。

直接 show you the code,这是最好的方法:

$data = array(
    'foo'=>'bar', 
    'baz'=>'boom', 
    'site'=>'localhost', 
    'name'=>'nowa magic'); 
$data = http_build_query($data); 
//$postdata = http_build_query($data);
$options = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type:application/x-www-form-urlencoded',
        'content' => $data
        //'timeout' => 60 * 60 // 超时时间(单位:s)
    )
);
$url = "http://localhost/test2.php";
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;

http://localhost/test2.php 的代码为:

$data = $_POST;
echo '<pre>';
print_r( $data );
echo '</pre>';

运行结果为:

Array
(
  [foo] => bar
  [baz] => boom
  [site] => localhost
  [name] => nowa magic
)

一些要点讲解:

1. 以上程序用到了 http_build_query() 函数,如果需要了解,可以参看 前面一篇《PHP使用http_build_query()构造URL字符串的方法》。

2. stream_context_create() 是用来创建打开文件的上下文件选项的,比如用POST访问,使用代理,发送header等。就是 创建一个流,再举一个例子吧:

$context = stream_context_create(array( 
    'http' => array( 
        'method' => 'POST', 
        'header' => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)). 
        "Content-type: application/x-www-form-urlencoded\r\n", 
        'content' => http_build_query(array('status' => $message)), 
        'timeout' => 5, 
    ), 
)); 
$ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);

3. stream_context_create创建的上下文选项即可用于流(stream),也可用于文件系统(file system)。对于像 file_get_contents、file_put_contents、readfile直接使用文件名操作而没有文件句柄的函数来说更有用。stream_context_create增加header头只是一部份功能,还可以定义代理、超时等。这使得访问web的功能不弱于curl。

4. stream_context_create() 作用:创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。

5. stream_context_create 还能通过增加 timeout 选项解决file_get_contents超时处理:

$opts = array(
  'http'=>array(
  'method'=>"GET",
  'timeout'=>60,
 )
);
//创建数据流上下文
$context = stream_context_create($opts);
$html =file_get_contents('http://localhost', false, $context);
//fopen输出文件指针处的所有剩余数据:
//fpassthru($fp); //fclose()前使用

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

PHP 相关文章推荐
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
Windows7下的php环境配置教程
Feb 28 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
Laravel中10个有用的用法小结
May 06 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 #PHP
PHP函数import_request_variables()用法分析
Apr 02 #PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 #PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 #PHP
PHP递归实现层级树状展开
Apr 01 #PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 #PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 #PHP
You might like
一个简洁的多级别论坛
2006/10/09 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
php 随机生成10位字符代码
2009/03/26 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
PHP中设置时区方法小结
2012/06/03 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
jquery拖动插件(jquery.drag)使用介绍
2013/06/18 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
通过C++学习Python
2015/01/20 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python随机数分布random均匀分布实例
2019/11/27 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
暑假实习求职信范文
2013/09/22 职场文书
校长就职演讲稿
2014/01/06 职场文书
决心书范文
2014/03/11 职场文书
车间安全生产标语
2014/06/06 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
mysql脏页是什么
2021/07/26 MySQL