PHP的file_get_contents( 'PHP://输入')很慢(PHP f

2019-10-17 13:47发布

我有一个使用与Zend框架构建的ESB模式复杂的PHP应用程序v1.x. 性能已成为一个问题,现在我知道为什么:阅读PHP://输入流始终采取整10秒。

下面是从XDebug的跟踪日志摘录:

0.3985    6935880    -> Zend_Controller_Request_Http->getRawBody() /var/www/vas/Adapters/Database/application/controllers/AdapterController.php:473
0.3985    6936104    -> file_get_contents() /usr/share/php/ZendFramework-1.12.0/library/Zend/Controller/Request/Http.php:961
10.4134   6936096    -> trim() /usr/share/php/ZendFramework-1.12.0/library/Zend/Controller/Request/Http.php:963

我们部署ESB模式,与请求去来回的门户网站,到ESB,到数据库适配器。 本身击中任何一个服务器似乎并不成问题,但只要请求进入服务器(这实际上是在同一台服务器上的虚拟主机)之间,这个问题本身抚养。

Answer 1:

原来,这是在任何的Apache的httpd或PHP中的错误,以及在Zend框架v 1.x的一个错误

当内容长度报头的值超过了实际内容长度发生错误。

例如,

curl http://localhost/index.php -H "Content-Length: 3" --data "12"

返回请求体之前:在上述例子中,10秒的超时时间必须在调用的file_get_contents(“//输入PHP”)之后到达。

在Zend框架1.x版,设置一个Zend_Http_Client对象的原始体导致要计算并注入到所述请求的Content-Length头。 但是,除非该请求是一个POST,PUT或DELETE请求,内容将被从实际的请求,这反过来,触发器在Apache / PHP无效内容长度错误删去。

我打开了一个bug用PHP,也将打开与Zend框架的错误。



文章来源: PHP file_get_contents('php://input') very slow