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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

1530閲覧

mysql / phpで稀に接続が拒否される

yuuyu

総合スコア1139

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2020/09/12 06:31

編集2020/09/12 07:40

現象

ローカル環境にて、PHPからmysqlに接続を試みると、稀に接続を拒否される
mysql.server startにてサーバーを立てた直後は接続に成功する
・最後のアクセスから少し時間をおくと、接続を拒否される場合がある
・一度接続を拒否されると、一度サーバーを閉じるか、一定時間置かないと再度アクセスが出来ない
・現状接続を拒否されるタイミングに法則性は見つかっていない
・接続が拒否される場合、タイムアウトのようなラグはなく、即座に接続拒否のエラーが返ります。

発生しているエラー

  • PHP

SQLSTATE[HY000] [2002] Connection refused

  • MySQL

general_log及びlog-errorを確認したところ、記述なし。

該当コード箇所

php

1self::$Database = new \PDO( 2 "mysql:dbname=xxxx;host=". $_ENV["HOSTNAME"] . ";charset=utf8mb4" . $_ENV["OPTION"], 3 $_ENV["ID"], 4 $_ENV["PASSWORD"] 5);

※dbnameはマスキングしています。
$_ENV["HOSTNAME"],$_ENV["ID"],$_ENV["PASSWORD"]はそれぞれホスト名、データベースのID,パスが代入されています。
また、optionにはshow variables like 'port';にて取得したポート番号が代入されています。

質問内容

PHPで接続拒否されることを防ぎたいのですが、何か改善方法はないでしょうか?

環境

macos 10.15.6
php 7.4.9
mysql 8.0.19(homebrew installed)

なお、ウェブサーバーはphp -S にて立てており、ホスト名は192から始まるローカルIPで接続しています。
mysqlのホスト名は、macのローカルホスト名.localになっています。
ただ、ウェブサーバーをローカルホスト名.local:8080にしても上記の現象は発生します。

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

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

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

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

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

unhappychoice

2020/09/12 06:58

拒否される場合に使用リソース等に問題はないですか? (CPU や Memory / Disk etc の使用率
yuuyu

2020/09/12 07:39

> unhappychoice さん CPU使用率や実メモリ等確認してみましたが、特に異常は確認できませんでした。 また質問内容に記述しておりませんでしたが、タイムアウトのように十数秒間音沙汰がないわけではなく、一瞬でConnection refusedが返されます。
guest

回答2

0

自己解決

mysqlのホスト名を"127.0.0.1"にすることが出来るということを知り、こちらに変更したところ、Connection refusedされなくなりましたので、一旦自己解決にします。
もししばらくして再び起こるようであれば再度質問します。

投稿2020/09/16 13:30

yuuyu

総合スコア1139

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

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

0

PHP 側できちんとコネクションをクローズしているでしょうか?

挙動からすると、コネクションを正しく切断していないので動かす度に接続数が増えていき、閾値を超えたところで Connection Refused になっているように見えます。
※時間をおくと接続可能になるのは、サーバー側で無通信のコネクションをタイムアウトで切断しているから

投稿2020/09/14 06:52

tacsheaven

総合スコア13703

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

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

yuuyu

2020/09/14 09:40

回答ありがとうございます。 > PHP 側できちんとコネクションをクローズしているでしょうか? 記憶違いでなければ、PHPは明示的に記述しなくても、スクリプトの実行終了と同時にデータベースとの接続を解除します。 意図的に接続を解除する場合でも、変数にnullを代入するだけなのですが、これ以外で何か操作が必要、という意味でしょうか?
tacsheaven

2020/09/14 23:31

PDO オブジェクトそのものを null にしても、PDO オブジェクトを参照している変数が残っていると、PDO オブジェクトは破棄されません。ですので正しく解除されたかどうか不明です。 一般的に RDBサーバとの接続処理は負荷が高いため、持続的接続を利用していることが多いのですが、そのあたりはどうなっているでしょうか? https://www.php.net/manual/ja/pdo.connections.php を参考に見直されてみてはどうでしょうか。
yuuyu

2020/09/16 02:33

提示されたurlを確認してみたのですが、 > 一般的に RDBサーバとの接続処理は負荷が高いため、持続的接続を利用している 持続的接続を維持するためには、PDO::ATTR_PERSISTENT => trueをコンストラクタの第四引数に明示的に示さないといけないと記載されているので、利用していないと思われます。 また、mysql側で、 mysql> SELECT * FROM information_schema.PROCESSLIST; を実行すれば接続数が確認できるという記述が別サイトであったのですが、こちらを確認すると、event_schedulerと上記を実行したプロセスしか存在していませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問