2016-07-06 18 views
0

私はApache/PHPアプリケーションを1台のサーバーに、PostgreSQLデータベースを2台目のサーバーに持っています。 SSLを介して接続するように構成されています。 $db->setAttribute(PDO::ATTR_PERSISTENT, true);がスクリプトに含まれていても、TCP接続は常に閉じられます。 PHP.INIはpgsql.allow_persistent = Onpgsql.auto_reset_persistent = Offpgsql.max_persistent = 30およびpgsql.max_links = 30です。 sudo netstat -napを使用すると、2つのサーバー間にESTABLISHED接続が存在しないことがわかります。接続を開いたままにするには、他に何をする必要がありますか?新しい接続オーバーヘッドは、要求ごとに10〜12ミリ秒です。php postgresql永続的な接続は常に閉じる

+0

pgBouncerのような接続プールを使用してください。常に。 –

答えて

0

私は、公正な方法ダウンPHPマニュアルページの1このノートを見つけた:

を持続的な接続を使用したい場合は、あなたがに渡されたドライバオプションの配列に PDO :: ATTR_PERSISTENTを設定する必要がありますPDO コンストラクタ。 オブジェクトのインスタンス化後にPDO :: setAttribute()でこの属性を設定すると、ドライバは永続的な接続 を使用しません。

これは私が間違っていたところです。私はこれを使用していた。

$host = explode('.',$_SERVER['SERVER_NAME']); 
$db = new PDO($host[0]); 
$db->setAttribute(PDO::ATTR_PERSISTENT, true); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

私はこれをやっているはずです時:

$host = explode('.', $_SERVER['SERVER_NAME']); 
$db = new PDO($host[0],null,null,array(PDO::ATTR_PERSISTENT=>true, 
     PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC)); 

DSNのpdo.iniファイルです。ヌルのユーザとパスワードは幸いにも無視されます。そうしないと、どちらもうまくいかないでしょう。今すぐnew PDOは10ミリ秒の代わりに0.02ミリ秒かかる。

関連する問題