[PHP-users 18133]Re: 持続的接続の接続上限秒数と接続数上限はどうやって指定する?

tatsuya matsuyama tatsuya @ matsuyama-architect.co.jp
2003年 9月 30日 (火) 22:16:43 JST


松山です。
重ねてレスありがとうございます。

----- Original Message ----- 
Sent: Tuesday, September 30, 2003 7:16 PM
Subject: [PHP-users 18129] Re: 持続的接続の接続上限秒数と接続数上限はどうやって指定する?

> MS SQLサーバであれPostgreSQLであれoracleであれ、
> 「PHPスクリプトが終了してもDB接続を切断しないことによって
>   後からくる他のリクエストがそのDB接続を引き続き使えるようにすることで
>   DB接続のオーバーヘッドを減らす」
> というのが持続的接続の目的ですので、
> pconnectを明示的に切断するという行為がその目的に
> 矛盾してるような気がするので、
> 明示的に切断する方法って無いような気がします。

確かに「矛盾」していると思います。

ことの相違は、apache(php)<->SQLserver間における
「ユーザー」の割り当て方にあるのだと思います。

通常ですと
apache(php)<->SQLserver間はある程度、固定のユーザー名をあてて、
その先でユーザー毎の個別の処理をすると思います。

ところが、私の場合は、
基幹DBということもあって、apache(php)<->SQLserver間で
個別のユーザー名をもってアクセスさせています。

前者の方法ですと、例えばnobodyというSQL認証のユーザーを
1人あててアクセスするので持続的接続の再利用率も高いので意味もあると思います。
# phpの持続的接続なども、この方法を想定しているのだと思います。
ところが、後者の方法ですと、
ユーザー数が多くなると接続の再利用率が下がるので
あっと言う間に最大接続数を消費してしまうのです。
# 逆に後者の方法は持続的接続をしないと
# connect/disconnect処理が頻発し、パフォーマンス上問題があります。

そこで、後者の方法では、
_pconnectされた接続を切る方法がないと、運用上とても痛いことになってしまうのです。

> 明示的に切断する方法を強いて言えば、
>     apache_child_terminate -- このリクエストの後にApacheプロセスを終了する
>     http://jp.php.net/manual/ja/function.apache-child-terminate.php
> を使ってApacheの子プロセスを殺すことによって、それにくっついている
> pconnectも切断されるようしむける、とか。

この方法は知りませんでした。
ただ、「PHPリク エストの最後」=「Apacheプロセスの終了」となると
「しむける」のがちょっと難しいかもしれません。
 
> 例えば、httpd.conf に
>     MaxRequestsPerChild 10
> を設定することで、子プロセスが10回リクエストを処理したら
> 子プロセス自ら自爆するようにできますので、その子プロセスによって
> 開かれている持続的DB接続も切断されることになります。
> そんな方法しかないですかねえ・・・。

この方法も思いつきませんでした。
ただ、例えば、ある段階で(前回メールでいう#1から#5のapacheプロセスのうち)
#3のプロセスでSQLserverにAさんからIさんの9人の接続が持続されていたとすると
10番目のJさんが#3のプロセスからアクセスした段階で9人分の持続的接続
もろとも自爆してしまいます。
# 希望の動作は、Aさんの「持続的接続」だけを切りたいのです。

書いていて思いますけど、
Jさんがアクセスした時に同じapacheのからのプロセス上に
AさんからIさんまでの持続的接続が存在することを知るには、
DB側に何らか方法を用意してあげないと無理ですよネ...

この先はapache寄りの話なのかもしれませんネ。
ありがとうございました。



PHP-users メーリングリストの案内