簡體   English   中英

PHP file_get_contents('php:// input')非常慢

[英]PHP file_get_contents('php://input') very slow

我有一個復雜的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到數據庫適配器。 單獨擊中任何一台服務器似乎沒有問題,但是,只要請求在服務器之間(實際上是同一台服務器上的虛擬主機)之間通過,問題就會重新出現。

事實證明,這是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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM