2013-01-12 98 views
1

我有一個複雜的PHP應用程序,使用Zend Framework v1.x構建的ESB模型。性能已成爲一個問題,現在我知道爲什麼:閱讀php://輸入流一直持續幾乎10秒。PHP file_get_contents('php:// input')非常慢

這裏是從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,到數據庫適配器。點擊任何一臺服務器本身似乎沒有問題,但只要請求在服務器(實際上是同一臺服務器上的虛擬服務器)之間傳輸,問題就會隨之而來。

+0

如果在讀取或請求端,您可以監視請求服務器和端的網絡流量嗎? –

+0

它在閱讀方面。延遲特別發生在第一個讀取php://輸入的請求上,而不管應用程序何時發生。 –

+0

那麼'php:// input'請求不執行這種方式?是否可以使用其他類型的請求進行測試? –

回答

1

事實證明,這是Apache httpd或PHP中的一個錯誤,也是Zend Framework v 1.x中的一個錯誤。

當內容長度標頭的值超過實際內容長度時,會發生該錯誤。返回請求體之前:

例如,

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

在上述例子中,10秒的超時時間必須在調用的file_get_contents(「//輸入PHP」)之後到達。

在Zend Framework v1.x中,設置Zend_HTTP_Client對象的原始主體會導致計算Content-Length頭並將其注入到請求中。但是,除非請求是POST,PUT或DELETE請求,否則內容將從實際請求中被忽略,這反過來會觸發Apache/PHP無效內容長度錯誤。

我用PHP打開了一個錯誤,並且還會打開一個Zend Framework的錯誤。

+0

PHP錯誤:https://bugs.php.net/bug.php?id=64014 –

+0

ZF錯誤:http://framework.zend.com/issues/browse/ZF-12509 –