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 相关文章推荐
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
php轻松实现文件上传功能
Mar 03 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 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目录管理函数小结
2008/09/10 PHP
PHP SQLite类
2009/05/07 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
python实现斐波那契递归函数的方法
2014/09/08 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
获取Django项目的全部url方法详解
2017/10/26 Python
Python中的pack和unpack的使用
2018/03/12 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python热力图实现简单方法
2021/01/29 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
员工培训邀请函
2014/02/02 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
干部个人对照检查材料
2014/08/25 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
详解python网络进程
2021/06/15 Python