1

ZendFrameworkv1.xで構築されたESBモデルを使用する複雑なPHPアプリケーションがあります。パフォーマンスが問題になっていますが、その理由がわかりました。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、データベースアダプターに送信されます。1つのサーバーを単独でヒットすること自体は問題ではないようですが、要求がサーバー(実際には同じサーバー上のvhost)間で行われるとすぐに、問題が発生します。

4

1 に答える 1

2

これは、Apache httpdまたはPHPのバグであり、Zend Frameworkv1.xのバグであることがわかりました。

このバグは、content-lengthヘッダーの値が実際のコンテンツの長さを超える場合に発生します。

例えば、

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

上記の例では、file_get_contents('php:// input')を呼び出した後、リクエストの本文が返される前に10秒のタイムアウトに達する必要があります。

Zend Framework v1.xでは、Zend_HTTP_Clientオブジェクトのraw本体を設定すると、Content-Lengthヘッダーが計算され、リクエストに挿入されます。ただし、リクエストがPOST、PUT、またはDELETEリクエストでない限り、コンテンツは実際のリクエストから省略され、Apache/PHPの無効なコンテンツの長さのバグが発生します。

PHPでバグを開きましたが、ZendFrameworkでもバグを開きます。

于 2013-01-17T23:36:10.500 に答える