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语法(5)
Oct 09 PHP
php session处理的定制
Mar 16 PHP
php程序之die调试法 快速解决错误
Sep 17 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
php中各种定义变量的方法小结
Oct 18 PHP
PHP中OpenSSL加密问题整理
Dec 14 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 PHP
PHP的new static和new self的区别与使用
Nov 27 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 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
THINKPHP内容分页代码分享
2015/01/14 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
帝国cms常用标签汇总
2015/07/06 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
php接口技术实例详解
2016/12/07 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
强制设为首页代码
2006/06/19 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
微信小程序页面生命周期详解
2018/01/31 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
教师先进工作者事迹材料
2014/05/01 职场文书
学校火灾防控方案
2014/06/09 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
收入证明范本
2015/06/12 职场文书