3

いくつかの既製のPHPアプリケーション(ExpressionEngineとXCart)と、独自のカスタムコードで構成されるアプリケーションがあります。

私は実際の分析をしなかったので、それがどのように決定されたか正確にはわかりませんが、あまりにも多くのMySQL接続が閉じられていないままになっていると聞いても驚いていません(開発者で重大なメモリリークが発生しているので驚いていませんサーバー。最初の起動時に100MBから開始して、1日か2日の間に、RAMのギグ全体が消費され、キャッシュされるものはほとんどありません)。

では、どのPHPコードが原因であるかを正確に特定するにはどうすればよいでしょうか。私はXDebugの使用経験があり、個別のステージング環境がかなり安定している場合は、開発時にXDebugを改良し、それを使用して分析を行うことを提案しました。これは合理的ですか、および/または他の誰かがより具体的および/または追加の提案を持っていますか?

4

6 に答える 6

4

あなたは使用することができます

 SHOW PROCESSLIST  

実行中のプロセスを確認するSQLコマンド。これにより、各プロセスで使用されているユーザー名、ホスト、データベースなどがわかります。これにより、特に多数のデータベースにアクセスしている場合に、何が起こっているのかがわかります。

詳細はこちら:https ://dev.mysql.com/doc/refman/8.0/en/show-processlist.html

于 2009-10-29T13:45:38.633 に答える
2

mysql接続は自動的に閉じられることになっているため、これはphpコードが原因ではありません。

cf:http ://www.php.net/manual/function.mysql-connect.php:

サーバーへのリンクは、mysql_close()を明示的に呼び出して以前に閉じられていない限り、スクリプトの実行が終了するとすぐに閉じられます。

いくつかの提案:

  • 開発者は技術的に本番mysqlサーバーに直接アクセスできますか?はいの場合、おそらくMysqlManagerを開いたままにしておきます:)
  • 毎日のバッチプロセスはありますか?はいの場合、メモリにゾンビプロセスがある可能性があります
于 2009-10-29T13:26:53.793 に答える
1

mysql_connect他の人が言ったように、PHPは、または同等のmsqli/PDOを介して作成されたMySQL接続を終了します。

ただし、を使用して永続的な接続を作成できますmysql_pconnect。開いている既存の接続を探し、それらを使用します。見つからない場合は、新しいものを開きます。一度に多くのリクエストがあった場合は、接続の負荷が開いて開いたままになる可能性があります。

接続の最大数を減らしたり、持続的接続のタイムアウトを減らしたりすることができます。詳細については、 manページの下部にあるコメントを参照してください。

于 2009-10-29T13:45:38.653 に答える
1

ページが終了すると、PHPはすべてのmysql接続を自動的に閉じます。PHP Webアプリケーションに閉じられていないmysql接続が多すぎる唯一の理由は、1)接続プールを使用しているか、2)mysqlサーバーまたはコネクターにバグがあることです。

ただし、実際にコードを調べて接続先を見つけたい場合は、 http: //xdebug.org/docs/profilerを参照してください。

于 2009-10-29T13:28:05.820 に答える
1

以前は、スレッド数についてSHOW STATUSをポーリングするスクリプトを実行していましたが、mysql_pconnectを使用すると常に多数のスレッドが促進されることに気付きました。接続率が実際に低下しているのがいつなのかわからなかったので、非常に戸惑いました。そこで、mysql_connect()が呼び出されたすべての場所を一元化し、mysql_pconnect()を排除するようにしました。

次に行ったのは、接続のタイムアウトを調べて、30秒程度に調整することでした。だから私はmy.cnfを調整しました

connect-timeout = 30

そのため、実際に接続数が減少しているのを見ることができました。開く必要のある接続の数を決定するには、実行しているApacheワーカーの数に、それぞれが開くデータベース接続の数を掛けたものに依存します。

私が始めたもう1つのことは、SHOW PROCESSLISTまたはmytopでクエリを見つけるためにクエリにメモを追加することでした。結果に、次のようなメモ列を追加します。

$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";

これは、mytopを見たときにクエリを発行しているファイルを表示し、MySQLクエリキャッシュを使用するように失敗しませんでした

/* __FILE__.'.'.__LINE__ */ 

私のクエリの開始時に。

于 2009-10-30T06:34:01.940 に答える
0

特にMySQLとは対照的に、特に独自のカスタムコードのコンテキスト内で、一般的なメモリの問題に関して、私ができる別の2つのことは、コードをいずれかの呼び出しでラップすることだと思います。次のPHP組み込み関数:

memory_get_usage

memory_get_peak_usage

特に、私は現在いくつかのカスタムコードからのロギングに取り組んでいるので、それを使用している間にメモリ使用量をログに記録できます

于 2009-10-29T14:17:39.910 に答える