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中取得image按钮传递的name值
Oct 09 PHP
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
PHP链表操作简单示例
Oct 15 PHP
使用phpQuery获取数组的实例
Mar 13 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
详解json在php中的应用
Sep 30 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
Apr 10 PHP
PHP优化之批量操作MySQL实例分析
Apr 23 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
php ios推送(代码)
2013/07/01 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
php中使用GD库做验证码
2016/03/31 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
解读Python中degrees()方法的使用
2015/05/18 Python
Python进程间通信用法实例
2015/06/04 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
出纳岗位职责
2013/11/09 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
中班开学寄语
2014/04/04 职场文书
我的老师教学反思
2014/05/01 职场文书
会计人员演讲稿
2014/09/11 职场文书
学习心理学心得体会
2016/01/22 职场文书