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下intval()和(int)转换使用与区别
Jul 18 PHP
PHP多个版本的分析解释
Jul 21 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
Nov 26 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php使用session二维数组实例
Nov 06 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
php三种实现多线程类似的方法
Oct 30 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中散列密码的安全性分析
2019/07/26 PHP
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
int和Integer有什么区别
2013/05/25 面试题
历史系毕业生自荐信
2013/10/28 职场文书
数控技术应届生求职信
2013/11/13 职场文书
群众路线批评与自我批评
2014/02/06 职场文书
中学教师自我鉴定
2014/02/07 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
北京英语导游词
2015/02/12 职场文书
白银帝国观后感
2015/06/17 职场文书
小学体育课教学反思
2016/02/16 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
SQL Server中使用表变量和临时表
2022/05/20 SQL Server