ステップ1:Webサーバーではなく、アプリケーションであることを確認します
Cake階層の外側に単純なhelloworldファイルを作成します
<?php
echo 'Hello World';
そして、それが実行されるのにかかる時間を確認してください。サーバー/ネットワークレベルで起こっていることをアプリケーションのせいにするのは簡単なこともあります。
test.php
妥当な時間内にレンダリングすると仮定して、ステップ2に進みます。
ステップ2:すべてをバックアップする
プロダクションコードをいじることは常に危険なゲームです。修復できないものが破損した場合に備えて、データベースの完全バックアップを開始する前に、ケーキディレクトリツリー全体をコピーしてください。1日の作業が終わったら、本番ディレクトリとコピーの内容を(GUIツールまたはコマンドラインを使用して)比較します。
diff -r production-cake copy-of-cake
ステップ3:データベースはほとんどの場合LAMPスタックの最初のボトルネックです
PHPアプリケーションは、特に実際のSQLクエリの多くを隠すActiveRecordスタイルモデルを使用している場合に、多くのSQLクエリを生成します。クエリをファイルやデータベーステーブルに記録するようにCakeを設定することをお勧めします。これを行うためのいくつかの手順がここにありますが、データベースではなくフラットファイルやsyslogにログアウトすることをお勧めします。DBリクエストをデータベースに記録すると、ページの読み込みごとのクエリ数が2倍になります。
また、IPアドレスからのリクエストのみをログに記録するように、IPチェックを追加することをお勧めします。そうすれば、ロギングがアプリケーションの通常の実行を劇的に妨げることはありません。
これが整ったら、単一の要求を行い、生成されているSQLを確認します。パフォーマンスを向上させるためにキャッシュをドロップできる場所として、同じクエリが何度も繰り返されていることを確認してください。シーケンシャルクエリも探す
select * from foo where id = 5
select * from foo where id = 6
etc...
これは、舞台裏で何が起こっているのかを理解せずに、誰かがループでモデルをロードしていることを示しています。
ステップ4:データベースでない場合は、システムコール
データベースがボトルネックではなく、PHP / Apacheが正しく機能している場合、次に探すのはシステムコールです。砲撃は物事を成し遂げるための迅速で汚い方法ですが、それは非常に費用のかかる操作です。それらの1つまたは2つをループに入れれば、完了です。
top
本番サーバーでまたはを実行ps
し、開始および停止しているプログラムを探してから、コードベースでそれらのコマンドを検索します。
ステップ4:すべてのコントローラーをコピーする
あなたは多くのコントローラーを持っているでしょう
/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...
これはURLに対応します
http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...
特定のリクエストをデバッグして、なぜそれが非常に遅いの かを理解する必要があるときはいつでも、コントローラーのコピーを作成してください。
/app/controllers/debugposts_controller.php
手動でリクエストします
http://www.example.com/debugposts/methodName
次に、必要な数のdebug/printステートメントをコントローラーファイルにスローできます。あなたが「運が良ければ」、元の開発者はおそらくコントローラーファイルに多くのロジックを詰め込んだでしょう。そのような状況であれば、「コードの半分をコメントアウトする」ゲームをプレイできるようになります。