[PHP-users 30547] Re: session_start()から先に進まない

Reiji Matsumoto matsumoto @ spline.oc.to
2006年 10月 16日 (月) 20:23:03 JST


松本です。こんにちは。
大分、見えてきましたね。

> 私はまだ見方がよくわからないのですが、これはADODB経由で
> 使っているPostgreSQLの、ポーリングで帰ってきてないとい
> うことなのでしょうか…?

> (gdb) bt
> #0  0x900bc8bc in poll ()
> #1  0x0149ad09 in pqSocketPoll ()
> #2  0x0149abd2 in pqSocketCheck ()
> #3  0x0149aab5 in pqWaitTimed ()
> #4  0x0149aa87 in pqWait ()
> #5  0x01497b5e in PQgetResult ()
> #6  0x0149805c in PQexecFinish ()
> #7  0x01497d2b in PQexec ()
> #8  0x056bb924 in php_pgsql_do_connect ()
> #9  0x056bbd8b in zif_pg_pconnect ()  ※←ここ重要!
> #10 0x02359379 in zend_do_fcall_common_helper_SPEC ()
> #11 0x0235ec71 in ZEND_DO_FCALL_SPEC_CONST_HANDLER ()
> #12 0x02358ea8 in execute ()

PHPの関数はC言語のソースファイルでPHP_FUNCTIONというマクロを
使って定義しますが、その時'zif_'というプレフィックスを付けます。

ですので、pg_pconnect()関数の中で止まっているみたいです。
PostgreSQLへの接続待ちが「障害A」の正体かも知れませんね。

pg_pconnectは最大で[httpdのプロセス数×接続文字列の種類]
のコネクションを作りますので、かえってレスポンスが低下する
場合があります。
ADODBでのやり方は私は分からないのですが、持続的接続をやめ
てみたら如何でしょうか。コネクションプールにはpgpool等を
利用すると良いと思いますが、取りあえずpg_pconnect()では
無く、pg_connect()を利用する方法でADODBを利用し、問題が
無いようでしたら、そのまま運用するのも手だと思います。




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