質問

データベースの取得、オブジェクトの作成(多数)など、多数のループに基づいて、あらゆる種類の大きなレポートを作成する大規模な管理ソフトウェアがあります。

PHP4では、64 MBのメモリ制限で問題なく実行できます-新しいサーバーに移動し、同じデータベースで同じコードを使用すると、メモリ制限がなければ、同じレポートが表示されません。 ..

PHP5が内部でかなり多くのことを変更したことは知っていますが、動作させる方法はありますか?

最後の質問は、スクリプトをダイエットする必要がある場合、どの戦略を適用しますか?

役に立ちましたか?

解決

私たちが遭遇した大きな問題は、オブジェクト間の循環参照であり、オブジェクトがスコープ外になったときにそれらがメモリを解放できないようにしました。

アーキテクチャによっては、__ destruct()を使用して参照を手動で設定解除できる場合があります。問題については、クラスを再構築し、循環参照を削除しました。

他のヒント

スクリプトのリソースを最適化する必要があるときは、常にコードの分析、プロファイリング、デバッグを試みます。 xDebugを使用します、および xDebug Profiler には、 APD 、およびベンチマークプロファイラ

さらに、この記事をお勧めします:

新しいサーバーに移行してから、MySQLとPHPのシステム変数が古いサーバーと同じであることを確認しましたか?

PHP5は多くの新しい機能を導入しましたが、その後方互換性のマントラのため、PHP5とPHP4の違いが、コードとデータベースを使用していないアプリケーションのパフォーマンスに大きな影響を与えるとは思わない変更されました。

ApacheまたはIISの同じバージョンでも実行していますか?

PHP4から5へのアップグレードよりも、新しいシステム環境に関連する可能性が高い問題のように聞こえます。

バートランド、

既存のコードのリファクタリングに関心がある場合は、レポートの実行中にCPUとメモリの使用量を最初に監視することをお勧めします。 SQLサーバーをロックしていますか、またはApacheをロックしていますか(PHPコードによってシステムに大きなストレスがかかっている場合に発生します)。

最初はMySQLを非常に遅くしたプロジェクトに取り組み、レポート生成プロセス全体をリファクタリングする必要がありました。ただし、終了すると、負荷は単純に(より複雑なPHPコードを介して)Apacheに転送されました。最終的な解決策は、データベース設計をリファクタリングして、レポート機能のパフォーマンスを向上させ、PHPを使用して、MySQLでネイティブに実行できなかった機能の余裕を取り戻すことでした。

レポートの性質によっては、レポートに使用されているデータの非正規化を検討する場合があります。データウェアハウスとして機能し、OLTP原則ではなくOLAP原則に基づいて設計された2番目のデータベースの構築を検討することもできます。 OLAPとデータウェアハウジングの一般的な説明については、Wikipediaを参照してください。

ただし、深刻なリファクタリングを検討する前に、phpinfo()を見て環境が十分に類似していることを確認してください。 PHPおよびSHOW VARIABLESの場合。 MySQLの場合

ギグ!?!

64MBでも大きい。

環境間の不一致を無視すると(非常に奇妙に聞こえます)、コードのリファクタリングが必要なようです。

データベースクエリの結果セットが配列にダンプされないように、コードをリファクタリングできる可能性があります。結果セットのイテレータを作成することをお勧めします。 (したがって、ほとんどの目的でそれらを配列として扱うことができます)。一度に1つのレコードを処理することと、一度に10,000レコードを処理することとの間には大きな違いがあります。

第二に、コードがデータの複数のインスタンスを作成している天気を見てください。オブジェクトを参照渡しできますか。 (「&」を使用)。 Hordeフレームワークの初期のバリアントを使用する場合、同様のことをしなければなりませんでした。 1 MBの添付ファイルは、参照としてではなくコピーとしてデータセット全体を渡した多数の呼び出しから50 MBになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top