第 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 以记录对文件和/或数据库表的查询。这里有一些关于执行此操作的说明,尽管我建议注销到平面文件和/或系统日志而不是数据库。将 DB 请求记录到数据库将使每页加载的查询数量翻倍。
我还建议添加一个 IP 检查,以便它只记录来自您的 IP 地址的请求。这样,您的日志记录就不会显着干扰应用程序的正常运行。
完成后,发出一个请求,然后查看正在生成的 SQL。寻找一遍又一遍重复的相同查询,作为可以放入一些缓存以提高性能的地方。还要寻找顺序查询
select * from foo where id = 5
select * from foo where id = 6
etc...
这表明有人在循环加载模型而不了解幕后发生的事情。
第 4 步:如果不是数据库,就是系统调用
如果数据库不是瓶颈并且 PHP/Apache 运行正常,那么接下来要寻找的是系统调用。脱壳是完成工作的一种快速而肮脏的方式,但它的操作成本非常高。在一个循环中获取其中的一两个,你就完成了。
在您的生产服务器上运行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
然后,您可以将任意数量的调试/打印语句放入控制器文件中。如果你“幸运”的话,最初的开发者可能会在控制器文件中卡住很多逻辑。如果是这种情况,那么您现在可以玩“注释掉一半代码”的游戏了。