如何加快 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 秒/次的主要内容,如果未能解决你的问题,请参考以下文章