0

大規模なWebアプリケーションを共有Webホスティング環境に移植しています。アプリはPHP4で作成されました。新しい環境にはPHP5.2があります。

何らかの理由で、PHP 5.2で実行しているときに、アプリケーションが大量のメモリをリークしています。私は、memory_get_usage()を使用して、メモリ使用量が64 MBの制限に達するまで文字通り監視できます(共有環境では非常に寛大で、サイトはPHP4で12または16MBで実行されていました)。

これは、PHP 5で変更されたものの副作用であると思われます。おそらく、引数でのオブジェクト参照の処理です。ただし、アプリケーションが非常に複雑で、部分的に十分に記述されていないため、リークの原因となる特定の動作を検索することは非常に困難です(はい、それは私のものです)。

アプリは共有ウェブスペースにインストールされているため、従来のデバッグ機能を使用できません(私が知る限り)。私は文字通り一日中プロジェクトに取り組んでいるので、ローカルで環境を再現することは避けたいと思います。

だから私の質問は:

  • 特に大量のオブジェクトを処理する場合、典型的なPHP4 => 5の移行の落とし穴を知っている人はいますか?それが私のリークの原因である可能性があります

  • PHPで使用される変数用の、デバッガーに依存しない、スクリプトのみの「グラフィカルスコープダンプ」ツールを知っている人はいますか。これは、これらの膨大な量のメモリを消費している変数を見つけるのに役立ちます。

4

3 に答える 3

2

私が 5.2 の 1 つのリリースで見つけた一般的な問題の 1 つは、memory_get_usage がキャッチせずに strtotime がリークすることでした。strptime に変更すると、問題が修正されました。

これに関する 5.2.8 のバグ レポートがあります - http://bugs.php.net/bug.php?id=46889

于 2009-10-15T12:33:27.213 に答える
2

この問題を解決するには、次のようにします。

  1. xdebug+wincachegrind (またはその他のプロファイラー) および/または firephp を使用してスクリプトをプロファイリングします。
  2. STRICT モードをオンにして、すべての php エラー + 通知を取得します。

そうすることで、次のことができるようになります。

  • コードを最適化します。(エラー/警告/通知を削除すると、コードを高速化できます)
  • コードをきれいにします。(適切な php5 オブジェクト構文を使用すると、パフォーマンスが向上するだけです)。

オブジェクト モデルは、PHP4 から PHP5 に完全に変更されました。確かに、STRICT モードでは、明示的な「参照渡し」を使用してはならないことがわかります。

于 2009-10-15T13:22:19.500 に答える
0

デバッガーがなければ、多くのメモリを使用すると思われるスクリプトを開き、memory_get_usage 関数を重要なローカルに配置できます。

于 2009-10-15T12:32:28.770 に答える