如何加快 1800 行 PHP 包含?它使我的页面加载速度降低到 10 秒/次

Posted

技术标签:

【中文标题】如何加快 1800 行 PHP 包含?它使我的页面加载速度降低到 10 秒/次【英文标题】:How can I speed up a 1800-line PHP include? It's slowing my pageload down to 10sec/view 【发布时间】:2011-02-15 17:37:49 【问题描述】:

我设计了我的代码,将所有重要的函数放在一个现在有 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 脚本完成时它都会关闭并且每次都重新打开和重新编译。

【问题讨论】:

这是 WTF 的组成部分。 TheDailyWTFs,就是这样。 绝对将其拆分为执行特定功能的模块并为您节省大量带宽。这也将使您的代码更简洁,更易于使用。 不是行数。我的 PHP 页面很长,而且加载速度很快。我还拥有总长度十倍的整个基础架构,它们不会导致那么大的减速。 【参考方案1】:

您可以拥有一个包含 100 000 行代码的文件,但加载它仍然不需要 10 秒。

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

【讨论】:

向你致敬,好先生!第二天,当我们还新鲜的时候,我们很快就解决了这个问题。【参考方案2】:

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

【讨论】:

【参考方案3】:

您能否将函数分组为更小的文件并按需加载?

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

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

【讨论】:

【参考方案4】:

无论如何,一定要拆分该文件 - 如果不出意外的话,让您的代码库更有条理所带来的生产力收益将是值得的。

【讨论】:

@beagleguy - Dav 所说的生产力是程序员的生产力。如果将函数拆分为符合逻辑的、可管理的文件,则查找和维护函数会容易得多。 1800 行并不是一个文件那么大。 @aviraldg 查看 Cake 或 CodeIgniter 的源代码,很容易找到许多超过 1800 行的文件。 事实上,将文件分解为更小、更热门的文件会产生一个方便的副作用,即更容易找出导致加载速度变慢的原因 - 因为I/O 解析时间绝对不是导致此处脚本运行延迟 10 秒的原因。【参考方案5】:

令人惊讶的是,一个包含(即使是 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);

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于如何加快 1800 行 PHP 包含?它使我的页面加载速度降低到 10 秒/次的主要内容,如果未能解决你的问题,请参考以下文章

如何使我的 php 项目像 .exe 文件一样可分发

如何使我的开源 PHP 应用程序跨服务器?

如何加快包含 sql 查询的代码?

我在 Flutter 中遇到了一个问题:在构建 TextField 时抛出了以下断言,它使我遇到了一个奇怪的问题

php include_once 使我的代码停止运行

如何延迟或异步此 WordPress javascript 片段以最后加载以加快页面加载时间?