8

定期的に次のエラーが発生します。

PHP 致命的なエラー: メッセージ 'SQLSTATE[HY000] [1129] を含む例外 'PDOException' がキャッチされない 「mysqladmin flush-hosts」でブロックを解除します

ここに書かれているように、通常の (crontab のような) mysqladmin flush-hostsコマンドを使用するか、max_connect_errors システム変数を増やすことで問題を解決するのは簡単です。

しかし !「連続して中断された接続要求が多い」とは何ですか、なぜこれが起こっているのですか?

ブロッキングを修正するよりも、上流で問題を防止したいのです。

MySQL バージョン: 5.5.12。Zend Framework 1.11.10 と Doctrine 2.1.6 を使用しています。

私の PHP コードには mysql_close() も mysqli_close() もありません。

max_connect_errors のデフォルト値は 10 ですが、まだ増やしたくありません。なぜエラーが発生したのかを理解したいのです。mysqladmin flush-hosts コマンドを実行する cron を 5 分ごとに使用します。

4

2 に答える 2

1

この応答は、セキュリティ対策として設計されたものであり、mysql のmax_connection_errors値に達した結果です。これは、Oracleが提供するリンクで、考えられる原因と解決策のほとんどを詳しく説明しています。

最終的にこれは、MySql が接続試行への応答を停止するほど多くの接続失敗が連続して発生することを意味します。

mysqladmin flush-hosts コマンドを実行する cron を 5 分ごとに使用します。

この制限にすぐに到達するため、考えられる原因はいくつかあります。

  1. サーバーが PDO を使用するように正しく構成されていません。
  2. コードの実行には、新しい接続の作成が非常に頻繁に含まれます。
    • その結果、max_connections値にすぐに到達し、その後のすべての接続試行が失敗します... したがって、すぐにmax_connection_errors制限に達します。
  3. コードが無限ループに陥っているか、カスケード エラーが発生しています。
    • 明らかな可能性ですが、言及する必要があります。
    • (つまり、ページ A はページ B とページ C を呼び出し、ページ C はページ A を呼び出します)
  4. PDO は正常に動作していますが、一部のスクリプトは実行に時間がかかるか、終了しません。
    • これをキャッチする最も簡単な方法は、max_execution_timeを下げることです。

いずれにせよ、これを追跡するのは難しいでしょう。

  1. すべての mysql 接続試行のスタック トレースをログに記録して、これを引き起こしているコードを見つけます。
  2. mysql.err ログファイルを確認してください

PDO では mysql 接続を明示的に閉じる必要はありませんが、このような場合には、そのような ServerAdmin ハントを防ぐことができるいくつかの方法があります。

  • 常に明示的に mysql 接続を閉じます。
    • すべての接続を処理する単純なクラスを作成します。開き、配列を返し、閉じます。
    • 接続を開いたままにする必要があるのは、カーソルの場合だけです。
  • 接続引数は、必要なすべての場所に含まれる 1 つのファイルに常に定義してください。
  • max_execution_timeが必要であり、サーバーがそれを処理できることがわかっている場合を除き、max_execution_timeを増やさないでください。必要な場合は、必要なスクリプトの値のみを明示的に増やしてください。php.net/manual/en/function.set-time-limit.php
    • max_execution_timeを増やす場合は、max_connectionsを増やします。

dev.mysql.com/doc/refman/5.0/en/cursors.html

于 2012-08-10T06:39:36.440 に答える
0

これは、mysqld が特定のホストから途中で中断された多くの接続要求を受信したことを意味します。詳細については、ドキュメントのこのリンクを参照してください。

于 2012-08-03T13:50:03.507 に答える