第 1 步:确保是应用程序,而不是 Web 服务器
在 Cake 层次结构之外创建一个简单的 hello world 文件
<?php
echo 'Hello World';
然后看看运行需要多长时间。有时很容易将服务器/网络级别发生的事情归咎于应用程序。
假设test.php 在合理的时间内呈现,请继续进行第二步。
第 2 步:备份所有内容
摆弄生产代码始终是一种危险的游戏。在开始之前做一个完整的数据库备份,以防你损坏了无法修复的东西,并复制整个蛋糕目录树。一天结束后,比较生产目录和副本的内容(使用 GUI 工具或命令行)
diff -r production-cake copy-of-cake
第 3 步:数据库几乎总是 LAMP 堆栈的第一个瓶颈
PHP 应用程序会生成大量 SQL 查询,尤其是当人们使用隐藏大量实际 SQL 查询的 ActiveRecord 样式模型时。您需要设置 Cake 以记录对文件和/或数据库表的查询。有一些关于这样做的说明here,尽管我建议注销到平面文件和/或系统日志而不是数据库。将数据库请求记录到数据库将使每次页面加载的查询数量翻倍。
我还建议添加 IP 检查,以便它只记录来自您的 IP 地址的请求。这样,您的日志记录就不会显着干扰应用程序的正常运行。
完成后,发出一个请求,然后查看正在生成的 SQL。寻找一遍又一遍重复的相同查询,作为可以放入一些缓存以提高性能的地方。同时寻找顺序查询
select * from foo where id = 5
select * from foo where id = 6
etc...
这表明有人在不了解幕后情况的情况下循环加载模型。
第四步:如果不是数据库,就是系统调用
如果数据库不是瓶颈并且 PHP/Apache 运行正常,那么接下来要查找的是system calls。脱壳是完成工作的一种快速而肮脏的方式,但它的操作成本非常高。循环获取其中的一两个,您就完成了。
在您的生产服务器上运行 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
然后,您可以将任意数量的调试/打印语句放入控制器文件中。如果你“幸运”的话,最初的开发者可能会在控制器文件中卡住很多逻辑。如果是这种情况,您现在可以玩“注释掉一半代码”的游戏了。