1

对于我们的在线游戏,我们在文件和文件夹中编写了大量按主题分组的 PHP 类和函数。最后,我们现在将所有后端代码(逻辑和数据库访问层)放在一组我们称为的文件中,并使用include_once('pathtolib/file.公司')

问题是我们对包含很懒惰,并且大多数包含语句都是在我们的 libs 文件中进行的,因此从每个网页中,每次我们包含任何 libs 文件时,我们实际上是逐个文件加载整个 libs。

这对性能有很大的影响。因此,最好的解决方案是什么?

  • 从 libs 文件中删除所有包含语句,只从网页中调用必要的语句?
  • 做点别的吗?

服务器使用经典的 LAMP 堆栈 (PHP5)。

编辑:我们混合了简单的函数(遗留原因和大部分代码)和类。所以自动加载是不够的。

4

8 回答 8

3

如果您以面向对象的方式进行编程,则可以使用自动加载功能,该功能会在您调用类时按需从源文件中加载类。

编辑:我注意到有人对提到自动加载的两个答案都投了反对票。我们错了吗?__autoload 函数的开销是否太高而无法将其用于性能目的?如果有什么我没有意识到这种技术,我真的很想知道它是什么。

于 2008-09-18T14:55:59.570 回答
3

如果你想获得真正的硬核,请进行一些静态分析,并准确找出何时需要哪些库,并且只包含这些库。

如果您使用includeand not include_once,那么那里也可以节省一些速度。

综上所述,Matt 关于 Zend Optimizer 的回答是正确的。如果您愿意,请尝试免费的高级 PHP 缓存 (APC),它是一种操作码缓存。它应该在 PECL 存储库中。

于 2008-09-18T15:05:11.670 回答
3
  • 仅在需要时手动管理所有包含
  • 将您的 include_path 设置为它必须在的位置,默认值类似于 .:/usr/lib/pear/:/usr/lib/php,仅将它指向它必须在的位置,php.net/set_include_path
  • 不要使用自动加载,它很慢并且使 APC 和等效的缓存作业变得更加困难
  • 您可以关闭 APC 中的“stat”操作,但每次更新文件时都必须手动清除缓存
于 2008-09-18T15:07:40.400 回答
2

您可以使用 spl_autoload_register() 或 __autoload() 来创建包含类所需文件的任何规则,但是自动加载会引入其自身的性能开销。您需要确保使用 php.ini 设置或 apache 配置将您使用的任何内容添加到所有 gui 页面。

对于具有通用函数的文件,我建议您将它们包装在一个实用程序类中并进行简单的查找和替换,以用 util::function() 替换所有 function() 调用,这样您就可以自动加载这些函数(同样,调用方法而不是全局函数会产生开销)。

本质上,最好的办法是回顾您的代码并通过修复包含问题来偿还您的设计债务。这将为您带来最大的性能优势,并允许您充分利用 eAccelerator、Zend Platform 和 APC 等优化器

这是动态加载内容的示例方法

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}
于 2008-09-18T15:13:44.707 回答
2

您正在寻找的是Automap PECL 扩展

它基本上允许自动加载,只需加载预先计算的地图文件的一小部分开销。如果您知道特定目录只会从某些 PHP 文件中提取,您也可以细分地图文件。

你可以在这里阅读更多关于它的信息。

于 2008-09-18T20:31:56.830 回答
1

我使用 php 已经有一段时间了,但在这种情况下 Zend Optimizer 或 Cache 不应该提供帮助吗?php 是否仍然为每个请求再次加载和编译每个包含的文件?

我不确定自动加载是否是答案。如果包含这些文件,则可能在包含它的类中需要它们,因此它们仍然会被自动加载。

于 2008-09-18T15:00:11.993 回答
1

使用字节码缓存(最好是 APC),这样 PHP 就不需要在每次页面加载时解析库。请注意,使用自动加载将抵消使用字节码缓存的好处(您可以在此处阅读有关此内容的更多信息)。

于 2008-09-18T15:06:36.470 回答
1

使用分析器。如果你试图在没有措施的情况下进行优化,你就是在盲目地工作。

于 2008-09-18T20:00:00.680 回答