1

我有一个复杂的 PHP 应用程序,它使用使用 Zend Framework v1.x 构建的 ESB 模型。性能已经成为一个问题,现在我知道原因了:读取 php://input 流始终需要几乎正好 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,再到数据库适配器。单独访问任何一台服务器似乎没有问题,但只要请求在服务器之间(实际上是同一台服务器上的虚拟主机),问题就会出现。

4

1 回答 1

2

事实证明,这是 Apache httpd 或 PHP 中的一个错误,也是 Zend Framework v 1.x 中的一个错误。

当内容长度标头的值超过实际内容长度时,就会出现该错误。

例如,

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

在上面的示例中,在调用 file_get_contents('php://input') 之后必须达到 10 秒的超时,然后才能返回请求正文。

在 Zend Framework v1.x 中,设置 Zend_HTTP_Client 对象的原始主体会导致计算 Content-Length 标头并将其注入请求中。但是,除非请求是 POST、PUT 或 DELETE 请求,否则实际请求中的内容将被省略,进而触发 Apache/PHP 的无效内容长度错误。

我已经用 PHP 打开了一个 bug,还将用 Zend Framework 打开一个 bug。

于 2013-01-17T23:36:10.500 回答