PHP中为什么使用file_get_contents("php://input")接收微信通知
发布:smiling 来源: PHP粉丝网 添加日期:2023-10-25 17:09:50 浏览: 评论:0
微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式,通知到开发者在开发者中心处设置的服务器地址(回调url),从而开发者可以获取到该信息。PHP中为什么会使用file_get_contents("php://input")来接收呢?为什么有些场景file_get_contents("php://input")会接收不到呢?
php用file_get_contents("php://input")或者$HTTP_RAW_POST_DATA可以接收xml数据。
file_get_contents()
file_get_contents() 函数把整个文件读入一个字符串中。
php://input
php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。
php://input使用范围
1、 读取POST数据
2、不能用于multipart/form-data类型
$http_raw_post_data
$http_raw_post_data是PHP内置的一个全局变量。它用于,PHP在无法识别的Content-Type的情况下,将POST过来的数据原样地填入变量$http_raw_post_data。它同样无法读取Content-Type为multipart/form-data的POST数据。需要设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。
php://input、$http_raw_post_data、$_POST、$_GET区别
1、GET提交时,不会指定Content-Type和Content-Length,它表示http请求body中的数据是使用http的post方法提交的表单数据,并且进行了urlencode()处理。
2、 POST提交时,Content- Type取值为application/x-www-form-urlencoded时,也指明了Content-Length的值,php会将http请求body相应数据会填入到数 组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。
3、php://input数据,只要Content-Type不为 multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与http entity body部分数据是一致的。该部分相一致的数据的长度由Content-Length指定。
4、仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。
5、php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。
接收和发送XML的php示例
php示例:接收XML
接收xml数据,并转化为array数组。
- <?php
- $xmlData = file_get_contents("php://input");
- $obj = simplexml_load_string($xmlData,"SimpleXMLElement", LIBXML_NOCDATA);
- $json = json_decode(json_encode($obj),true);
php示例:发送xml
- <?php
- $xml = '<xml>xmldata</xml>';//要发送的xml
- $url = 'http://***.php';//接收XML地址
- $header = 'Content-type: text/xml';//定义content-type为xml
- $ch = curl_init(); //初始化
- curl curl_setopt($ch, CURLOPT_URL, $url);//设置链接
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头
- curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式
- curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//POST数据
- $response = curl_exec($ch);//接收返回信息
- if(curl_errno($ch)){//出错则显示错误信息
- print curl_error($ch);
- }
- curl_close($ch); //关闭curl链接
- echo $response;//显示返回信息
- ?>
Tags: file_get_contents php://input
- 上一篇:php中的双引号与单引号的基本使用及区别
- 下一篇:最后一页
相关文章
- ·php file_get_contents读取大容量文件方法(2014-03-30)
- ·php 中file_get_contents超时问题的解决方法(2014-07-18)
- ·PHP file_get_contents采集程序开发教程详解(2014-07-21)
- ·file file_get_contents HTTP request failed(2014-08-17)
- ·php curl、fopen、file_get_contents实例代码(2014-08-17)
- ·php中file_get_contents()导致nginx出现504(2014-09-13)
- ·php file_get_contents返回空 无效解决办法(2014-09-13)
- ·php中file_get_contents 出现HTTP request failed! ...(2014-09-20)
- ·php提示Warning: file_get_contents(): couldn’t resolve(2014-09-20)
- ·解决PHP中file_get_contents抓取网页中文乱码问题(2014-09-21)
- ·如何使用php中的file_get_contents()函数将文件内容读入字符串(2020-01-07)
- ·php file_get_contents抓取Gzip网页乱码的三种解决方法(2020-06-23)
- ·php采用file_get_contents代替使用curl实例(2021-04-24)
- ·PHP中使用file_get_contents抓取网页中文乱码问题解决方法(2021-05-03)
- ·PHP中使用file_get_contents post数据代码例子(2021-05-14)
- ·PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)(2021-06-18)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)