我们有一家公司帮助我们在Cakephp 1.3中构建各种CRM。它当然有多个模型/控制器/视图,并与MySQL数据库交互。
与公司的合作变得糟糕,我们刚刚意识到,对于这台服务器的“每个”请求都会导致1.6Ghz双核PC上的CPU峰值大约20-60%,持续1-2秒。我们切换到nginx,这里的php进程也需要类似的CPU能力(在Windows和Ubuntu系统上)。
现在,我已经完成了代码......虽然有些页面是可以理解的繁琐(模型在Controller中加载,一个视图带有一个'foreach'循环,其中有一个嵌套的'foreach'循环),有些像roles_controller.php这样的页面只有3个角色只需要在视图中列出用户!我甚至在视图中禁用了'foreach'循环(注释掉所有内容),但它仍需要那么多CPU。
是否与调度程序/路由配置有关?我们无法将大部分数据缓存为内部工具(出租车预订),并且只能提供最新数据。我已将/ cake目录重置为原始但无效。
总结一下,我想知道这在所有Cakephp甚至PHP设置中是否都很常见......如果没有,我该如何跟踪导致高CPU使用率的原因..?
谢谢!
答案 0 :(得分:1)
跟踪执行函数和循环的执行时间,以确定哪一个确实导致了如此大的负载。逐个测试。 如前所述,这肯定是由http /进程下的PHP / Apache引起的,而不是远程连接...网络不在这个故事中。
确定瓶颈后,您可以在此处发布此功能,以便我们帮助您优化它。
我只是调查了html->链接,似乎没什么性能有害,但在途中我看到一些名为'clean'的函数,即过滤输出并执行大量正则表达式,我可以说这可能会导致速度减慢,只是取决于HTML的数量,如果我没有错误:) 这里的重点是RegEx只是性能上的,而_output预先形成12个这样的正则表达式。 文件位置:cake / libs / view / helper.php 行号:880-912 功能代码:
/**
* Removes harmful content from output
*
* @return void
* @access private
*/
function __clean() {
if (get_magic_quotes_gpc()) {
$this->__cleaned = stripslashes($this->__tainted);
} else {
$this->__cleaned = $this->__tainted;
}
$this->__cleaned = str_replace(array("&", "<", ">"), array("&amp;", "&lt;", "&gt;"), $this->__cleaned);
$this->__cleaned = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u', "$1;", $this->__cleaned);
$this->__cleaned = preg_replace('#(&\#x*)([0-9A-F]+);*#iu', "$1$2;", $this->__cleaned);
$this->__cleaned = html_entity_decode($this->__cleaned, ENT_COMPAT, "UTF-8");
$this->__cleaned = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])(on|xmlns)[^>]*>#iUu', "$1>", $this->__cleaned);
$this->__cleaned = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([\`\'\"]*)[\\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2nojavascript...', $this->__cleaned);
$this->__cleaned = preg_replace('#([a-z]*)[\x00-\x20]*=([\'\"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2novbscript...', $this->__cleaned);
$this->__cleaned = preg_replace('#([a-z]*)[\x00-\x20]*=*([\'\"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#iUu','$1=$2nomozbinding...', $this->__cleaned);
$this->__cleaned = preg_replace('#([a-z]*)[\x00-\x20]*=([\'\"]*)[\x00-\x20]*data[\x00-\x20]*:#Uu', '$1=$2nodata...', $this->__cleaned);
$this->__cleaned = preg_replace('#(<[^>]+)style[\x00-\x20]*=[\x00-\x20]*([\`\'\"]*).*expression[\x00-\x20]*\([^>]*>#iU', "$1>", $this->__cleaned);
$this->__cleaned = preg_replace('#(<[^>]+)style[\x00-\x20]*=[\x00-\x20]*([\`\'\"]*).*behaviour[\x00-\x20]*\([^>]*>#iU', "$1>", $this->__cleaned);
$this->__cleaned = preg_replace('#(<[^>]+)style[\x00-\x20]*=[\x00-\x20]*([\`\'\"]*).*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*>#iUu', "$1>", $this->__cleaned);
$this->__cleaned = preg_replace('#</*\w+:\w[^>]*>#i', "", $this->__cleaned);
do {
$oldstring = $this->__cleaned;
$this->__cleaned = preg_replace('#</*(applet|meta|xml|blink|link|style|script|embed|object|iframe|frame|frameset|ilayer|layer|bgsound|title|base)[^>]*>#i', "", $this->__cleaned);
} while ($oldstring != $this->__cleaned);
$this->__cleaned = str_replace(array("&", "<", ">"), array("&amp;", "&lt;", "&gt;"), $this->__cleaned);
}
}
正如我想说的那样,大型htmls上的长期正则表现确实会导致良好的放缓。
检查以上内容并回复我们,以便我们深入调查。