如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局
Posted
技术标签:
【中文标题】如果 \'Content-Type: application/json\' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局【英文标题】:PHP 5.4.9 $_POST superglobal not created if 'Content-Type: application/json' is in header如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局 【发布时间】:2012-12-21 17:00:40 【问题描述】:我注意到在我的应用程序中使用 AWS Elastic Beanstalk php 5.4.9 AMI 时发生了一个奇怪的错误。
提交包含标头'Content-Type: application/json'
的GET AJAX 请求时,$_POST 超全局设置为空。如果我删除该标题,它将按预期设置为空白array()
这是预期的行为吗?
【问题讨论】:
文档中没有任何内容暗示这在 PHP > 5.4 中是预期的。我没有运行 PHP 5.4.9。但是,如果您可以通过执行上述操作来复制它,我会提交一个错误。 我记得关于 SO 的一个问题也是关于$_POST
是 NULL
。我不知道这是否与 AJAX 或 Json 内容类型请求标头有关。我不知道这是否已经解决了。我建议您在此处设置一些测试用例并概述如何重现。顺便说一句:如果您执行 GET 请求,则没有请求正文,因此没有 Content-Type
请求标头,因此看起来有点虚假。当然,这并不能解释 NULL
为 $_POST
,但人们可能也不应该期望太多。
你有一个测试用例来证明这一点吗?顺便说一句,如果你正在做一个 GET 那么 $_POST 不应该包含任何东西(尽管我相信它应该总是作为一个空数组存在)
我的 JS 框架 (spine.js) 始终包含该标头,无论它是 GET 还是 POST。我的服务器端框架 (Symfony2) 期望 $_POST 始终是一个数组。在 AWS 将 php 更新到 5.4.9 之前,这从来都不是问题。我会做更多的测试并报告。
看起来好像是 PECL HTTP 扩展导致了问题。
【参考方案1】:
原来这是 PECL 的问题。在运行 PHP 5.4 安装 PECL HTTP 时,当为 GET 请求提供“Content-Type: application/json”标头时,它会导致 $_POST 设置为 null。删除 PECL HTTP 解决了这个问题。
感谢 Michael@AWS 的发现。交叉线程:https://forums.aws.amazon.com/message.jspa?messageID=413836
编辑:由 PHP 团队修复:https://bugs.php.net/bug.php?id=63947&edit=2
【讨论】:
以上是关于如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局的主要内容,如果未能解决你的问题,请参考以下文章
MobileNet V12017-CVPR-MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applica
MobileNet V12017-CVPR-MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applica