0

PHPのソースコードとmysql_pconnect関数を調べてみたところ、 zend_globalsHashTable persistent_listで定義されている種類のものを使用していることに気付きました。

問題は、PHPがmod apache / fcgiとして設定されている場合、このグローバル変数と変数がリクエスト間でどのように保持されるかです。それがすべてのリクエストに対して生成された新しいPHPプロセスである場合、それらの変数は保持されるべきではありません。

4

2 に答える 2

1

PHP-FPMはコンテキストを再利用し、永続的な接続がFCGIで機能できるようにします。ただし、PHP-FPMは最初に複数のプロセスを作成するため、プロセスまたはコンテキストごとに1つずつ、複数の接続が作成されることになります。

考慮すべきことは、「持続的接続は良いよりも害を及ぼす」ということです。#php.peclで多くの人が言った文です。接続のオーバーヘッドは軽く、PHPはこの種の処理に適しています。常に実行するように設計された言語では、接続のオーバーヘッドが大きくなる可能性があるため(通常、接続するだけで、プログラムが直接操作するオブジェクトよりもはるかに多くのオブジェクトに影響を与えるため)、永続的な接続またはプールされた接続が理にかなっています。PHPは、すべてを可能な限り迅速に実行し、それを実行するために使用するリソースの量で地獄に落ちるように設計されています-すべては約250ミリ秒で実行する必要があります-mysqlに接続しても、他の場合のようにフレームワーク全体で大量のフックが発生することはありません言語なので、オーバーヘッドは非常に小さいです。さらに、

于 2012-12-26T11:21:50.253 に答える
-1

問題は、PHPがmod apache / fcgiとして設定されている場合、このグローバル変数と変数がリクエスト間でどのように保持されるかです。

apacheモジュールとして、apache httpd自体がまだ実行されているため、これらは共有されます。その実行中のプロセスはPHPを生成し、将来的には他のPHPを生成する予定です。子スレッドは親に関連付けることができるため、親のメモリスペースに格納できます。

FCGIとして、これはバイナリがすでに実行されている限り技術的に可能である可能性がありますが、これはFPMでは実装されていません。また、FCGIにとっても意味がありません。これは、スクリプトごとであり、タイムアウトも含まれるため、Webサーバー全体と同様に寿命がはるかに短いためです。

于 2012-12-24T16:09:24.657 に答える