4

我设计了我的代码,将所有重要的函数放在一个现在有 1800 行长的 PHP 文件中。

我在其他 PHP 文件(例如 AJAX 处理器)中使用简单的“require_once("codeBank.php")”来调用它。

我发现加载所有这些函数大约需要 10 秒,即使我只有几个全局数组和一堆其他函数。例如,主要的 AJAX 处理器代码需要 8 秒来进行简单的语法验证(其操作函数存储在 codeBank.php 中)。

当我注释掉 require_once 时,我的 AJAX 响应时间从 10 秒加速到 40 毫秒,所以很明显 PHP 正在尝试对这 1800 行函数做一些事情。即使安装了 APC,这也是令人惊讶的。

我应该怎么做才能让我的代码速度回到低于 100 毫秒的水平?我是否无法以某种方式获得缓存的好处?我是否需要将单个功能库文件切割成不同的部分?我还可以做其他一些微妙的事情来缩短我的响应时间吗?

或者除此之外,还有哪些工具可以进一步挖掘哪些 PHP 操作遇到了减速带?

===========================

[编辑] 已解决。

===========================

正如你们中的许多好心人所指出的那样,仅仅拥有一个 1800 行的 php 函数库会导致速度变慢,这没有任何合乎逻辑的理由。实际发生的情况是,我有一个调试行正在调用其中一个较长的 API 调用函数。每当我包含 PHP 文件时,我都是从远程查询数据构建一个完整的数据结构。

一旦我杀了那条线,一切都回到了快速的 30 毫秒响应。让我感到奇怪的是,每次调用 AJAX 脚本时,require_once() 都会打开 php 文件。但那是我走样了,忘记了每次 AJAX 脚本完成时它都会关闭并且每次都重新打开和重新编译。

4

6 回答 6

6

你可以有一个包含 100 000 行代码的文件,但它仍然不应该花费 10 秒来加载。

那里可能有一些您没有意识到正在运行的初始化代码。查看分析器(xdebug 或 Zend Studio 中的分析器),并找出导致速度变慢的确切原因,然后再进行优化。如果您认为这仅仅是因为该文件有 1800 行长,那么您就走错了路。

于 2010-05-05T01:24:11.950 回答
1

确保那里没有 sleep() 函数:) 在文件被处理后也使用 apc 来缓存文件,如果在 apc 缓存文件时它仍然很慢,那么问题出在其他地方。我已经包含了 20,000 行的文件,没有任何问题。

于 2010-05-05T01:26:42.387 回答
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);
于 2010-05-05T01:26:17.707 回答
0

我无法想象一个 1800 行的文件会成为问题,我只有一个包含在我所有页面中的众多类中的一个,即 1870 行,它永远不会导致问题。您包含的文件中是否有任何文件或网络访问权限?

于 2010-05-05T01:27:49.110 回答
0

您可以将功能分组为较小的文件并按需加载吗?

它们是全局函数还是类,可能带有静态方法?

如果是这样,您可以从 PHP 的自动加载中受益。查看__autoload()或寻找更灵活的解决方案,查看spl_autoload_register().

于 2010-05-05T01:22:13.963 回答
0

无论如何,绝对要拆分该文件 - 如果没有其他任何事情,您将通过更有条理的代码库获得的生产力收益将是值得的。

于 2010-05-05T01:22:37.010 回答