如何创建一个快速的PHP库?

时间:2008-09-18 14:53:15

标签: php include

对于我们的在线游戏,我们已经编写了大量的PHP类和功能,按主题分组在文件和文件夹中。最后,我们现在将所有后端代码(逻辑和数据库访问层)放在一组文件中,我们称之为 libs ,我们在GUI(网页,表示层)中包含我们的库使用 include_once('pathtolib / file.inc')

问题是我们一直懒惰包含内容,并且大多数include语句都是在我们的libs文件中生成的,从每个网页开始,每次我们包含任何libs文件时,我们实际上都是按文件加载整个库。

这对性能有重大影响。那么什么是最好的解决方案?

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

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

编辑:我们有简单的功能(遗留原因和大多数代码)和类。所以自动加载是不够的。

8 个答案:

答案 0 :(得分:3)

如果您已经以面向对象的方式完成编程,则可以使用autoload函数,该函数将在您调用它们时按需从源文件中加载类。

编辑:我注意到有人对这两个引用自动加载的答案进行了低估。我们错了吗? __autoload函数的开销是否过高而不能将其用于性能目的?如果有什么我没有意识到这种技术,我真的很想知道它是什么。

答案 1 :(得分:3)

如果你想获得真正的核心,做一些静态分析,并确切地确定何时需要哪些库,并且只包含那些。

如果你使用include而不是include_once,那么也可以节省一点速度。

所有这一切,Matt关于Zend Optimizer的回答是对的。如果需要,请尝试使用高级PHP缓存(APC),这是一个操作码缓存,并且是免费的。它应该在PECL存储库中。

答案 2 :(得分:3)

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

答案 3 :(得分: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');
        }
    }
}

答案 4 :(得分:2)

您要找的是Automap PECL extension

它基本上允许自动加载,只需要很少的开销来加载预先计算的映射文件。如果您知道特定目录只会从某些PHP文件中提取,您也可以对地图文件进行细分。

您可以详细了解here

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

使用字节代码缓存(理想情况下为APC),以便PHP不需要在每个页面加载时解析库。请注意,使用自动加载会否定使用字节码缓存的好处(您可以阅读有关此here的更多信息)。

答案 7 :(得分:1)

使用profiler。如果你试图在没有措施的情况下进行优化,那你就是盲目的。