2015-10-02 12 views
9

PHPRedisとApache PHP-FPMの使用私は接続を再利用するためにpconnect()コールを使用しています。過去にコネクションの数が高すぎないようにするのに役立ちました。しかし、プライマリredisノードがダウンした場合、スレーブは自動的にスレーブに昇格し、古いマスタは読み取り専用になります。しかし、pconnect()はまだ古いマストへの接続を保持しているので、set()コマンドは失敗し始めます。PHPRedisとPHP-FPMを使用しているときにpconnect()接続を閉じるかリセットするには?

私たちに必要なのは、プロセスを強制終了せずに永続的な接続を切断する方法です。何か案は?

答えて

10

永続ストリームはPHPの内部で提供されているが、それが書き込まれていないです永続的なストリームを作成する方法を公開するものであれば、それを破棄する方法を提供する必要があります。

PHP Redisは法律を破っており、ユーザーランドからの永続ストリームを破壊する方法はありません。

アクションの流れは、必要なメソッドの実装をPRすることです。ここで

はRedisのを実装PHP7ブランチに対してパッチ:: pcloseです:pdisconnectためのコードは、既存の切断のオフに基づいている、ということhttps://gist.github.com/krakjoe/326eadc61bea38fdd6e6

注、これらの機能の両方が私には奇妙に見えるとはありません彼らの戻り値について正直である。その奇妙さに頼ってどこかのテストやコードがあると仮定して、修正しようとしていない。

これらの関数が奇妙に見えることをPRに言及する必要があります。

2

タイムアウトでpconnectを呼び出していますか?タイムアウトを超えるたびに接続が閉じていると仮定すると、別のアドレスでpconnectを再度呼び出す前にマスターを再解決することができます。

あなたはRedisのクラスタを実行している場合は、PHPRedisは「MOVED」応答をサポートして、この設定に固有のタイムアウト動作を持つクラスタモードがあります。 https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#timeout

関連する問題