我设计了我的代码,将所有重要的函数放在一个现在1800行的PHP文件中。
我在其他PHP文件中调用它 - 例如AJAX处理器 - 使用简单的“require_once(”codeBank.php“)”。
我发现加载所有这些函数大约需要10秒钟,即使我只有几个全局数组和一些其他函数。例如,主要的AJAX处理器代码只需要8秒钟来进行简单的语法验证(其操作函数存储在codeBank.php中)。
当我注释掉require_once时,我的AJAX响应时间从10秒加速到40ms,所以很明显PHP试图用1800行函数做一些事情。即使安装了APC,这也是令人惊讶的。
如何才能将代码速度恢复到低于100毫秒的水平?我是否未能以某种方式获得缓存的好处?我是否需要将单个功能库文件剪切成不同的部分?是否还有其他微妙的事情可以阻止我的响应时间?
或者除此之外,有哪些工具可以进一步挖掘哪些PHP操作会遇到速度障碍?
==========================
[编辑]已解决。
==========================
正如你们许多人所说的那样,没有合理的理由为什么只有一个1800行的PHP函数库会导致速度减慢。实际发生的是我有一个调试行调用了一个较长的API调用函数。每当我包含PHP文件时,我都是从远程查询数据构建一个完整的数据结构。
一旦我杀了那条线,一切都回到了快速的30毫秒响应。对我来说遗憾的是,每次调用AJAX脚本时,require_once()都会打开php文件。但是,这就是我的状态,并且忘记了每次AJAX脚本完成时它都会关闭,并且每次重新打开并重新编译。
答案 0 :(得分:6)
您可以拥有一个包含10万行代码的文件,但仍然不需要10秒钟才能加载。
那里可能有一些你没有意识到正在运行的初始化代码。看一下分析器(xdebug或Zend Studio中的分析器),然后在沿着优化路线前确切地找出导致减速的原因。如果您认为这仅仅是因为文件长度为1800行,那么您就走错了路。
答案 1 :(得分:1)
确保那里没有sleep()函数:) 在处理文件后也使用apc来缓存文件,如果在apc缓存文件时它仍然很慢,那么问题就出在其他地方。我已经包含20,000行的文件没有问题。
答案 2 :(得分:0)
您可以将功能分组为较小的文件并按需加载吗?
它们是全局函数还是类,可能使用静态方法?
如果是这样,您可以从PHP的自动加载中受益。查看__autoload()
或更灵活的解决方案,请查看spl_autoload_register()
。
答案 3 :(得分:0)
无论如何都绝对将该文件拆分 - 如果你的代码库更有条理,你所获得的生产力提升将是值得的。
答案 4 :(得分:0)
非常令人惊讶的是,包括(即使是1800行)也可以减慢它的速度。首先,也许您应该查看代码以确保它不执行不必要的处理。实际上解析文件应该不是一个瓶颈。
也就是说,包含是许多PHP程序中的关键瓶颈之一。您可以考虑将代码重构为许多较小的文件(其中只包含您需要的内容),或者(可能更容易),使用PHP的__autoload
函数。它是一个函数,只要你引用一个不存在的类就会自动调用它,因此你需要把你的函数放到一个静态类中。例如:
// include/ajaxlib.php
class AjaxLib {
public static function renderResponse($data) {
// whatever
}
}
// a common include file:
function __autoload($class) {
require 'include/' . strtolower($class) . '.php';
}
// your code:
AjaxLib::renderResponse($foo);
答案 5 :(得分:0)
我无法想象一个1800行的文件存在问题,我只有1870行的所有页面中包含的许多类中的一个,它从不会导致问题。您所包含的文件中是否有文件或网络访问权限?