質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

3049閲覧

PHP〜postgreSQLのタイムアウトに関して

norinorider

総合スコア4

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2020/07/26 07:03

apache2.4+PHP5.4+postgreSQL9.2の環境で質問です。
PHPからpg_connectでpostgresに接続して、pg_queryで問い合わせ、pg_fetch_rowで返答を取得し、pg_closeで切断....というのがPHP<=>DBのやりとりですよね。
PHPからの接続数がちょうどpostgresql.conf内のmax_connectionsに達しているときに、同時で追加接続要求を出したとします。これはただちにpostgresが接続エラーを返して接続失敗となるのでしょうか?
それとも、接続要求はpostgresのキューのようなところに保持され接続できるまで待つことになるんですかね。
まずapacheにはhttpd.confのTimeoutがあり、PHPにはphp.iniにあるmax_execution_timeまでスクリプトは終わらないし、postgresql.confにもstatement_timeoutのようなパラメータがあり指定時間内までならDBもエラーを返さないようだから、その作りからすると、例えば、max_connections=100で接続が100人フルの時にちょうど101人目が接続しようとしたら問答無用で即時エラーになるとは思えないのです。
言い方を変えますと、300人ぐらいが絶えずpostgresに接続しているwebサイトがあって、設定がmax_connections=100だとしても、これらタイムアウトの時間内で接続〜問い合わせ〜返答までできればmax_connectionを300にする必要はないのではないかとも思いました。
どんな仕掛けになっているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/26 09:11

試してみては? 1とか少ない数にすれば自身でもすぐに確認できそうなものですが
norinorider

2020/07/28 06:28

ご意見ありがとうございます。すでに運営しているサービスで、本体で実験できないでおりました。
guest

回答1

0

ベストアンサー

PHPからの接続数がちょうどpostgresql.conf内のmax_connectionsに達しているときに、同時で追加接続要求を出したとします。これはただちにpostgresが接続エラーを返して接続失敗となるのでしょうか?

接続数が超過するとエラーです。
PostgreSQLのトラブルシュートとチューニング

エラーメッセージ FATAL: connection limit exceeded for non-superusers
原因 非スーパユーザによるサーバへの接続数が (max_connections - superuser_reserved_connections) を超過しています。

超過時のエラーは上記のようなものです。

それとも、接続要求はpostgresのキューのようなところに保持され接続できるまで待つことになるんですかね。

PostgreSへの接続のプールを行うには、PgBouncerなどを利用します。
[mastodon] PgBouncerを導入する

投稿2020/07/26 09:20

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norinorider

2020/07/28 06:35

ありがとうございます!ご説明で、自分に都合が良い仕組みにはなっていないとわかりました。analyticsでサイトのリアルタイムユーザー数を確認するとそれは多いのですが、pg_log/のログには接続数オーバーの記録がつかない、ということは全ユーザーが「ほんとの同時」にDBにつないでいるわけではない、とも理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問