如何创建快速PHP库?

如何创建快速PHP库?,php,include,Php,Include,对于我们的在线游戏,我们已经在文件和文件夹中编写了大量的PHP类和函数,它们按主题进行分组。最后,我们将所有后端代码逻辑和数据库访问层放在一组文件中,我们称之为libs,并将libs包含在GUI网页中,表示层使用include_once'pathtolib/file.inc' 问题是,我们一直懒于包含,大多数包含语句都是在我们的libs文件中进行的,这导致从每个网页,每次包含任何libs文件时,我们实际上都会逐个文件加载整个libs 这对性能有重大影响。因此,最好的解决方案是什么 是否从libs

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

问题是,我们一直懒于包含,大多数包含语句都是在我们的libs文件中进行的,这导致从每个网页,每次包含任何libs文件时,我们实际上都会逐个文件加载整个libs

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

是否从libs文件中删除所有include语句,并仅从网页中调用必要的语句? 做点别的吗? 服务器使用经典的灯堆栈PHP5


编辑:我们混合了一些简单的函数和大多数代码和类。因此,自动加载是不够的。

如果您已经以面向对象的方式完成了编程,那么您可以使用该函数,该函数将在调用类时根据需要从它们的源文件加载类


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

如果你已经用面向对象的方式进行了编程,你可以利用这个函数,当你调用它们时,它会根据需要从它们的源文件加载类


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

我已经有一段时间没有使用php了,但是Zend优化器或缓存在这种情况下不应该有帮助吗?php是否仍然为每个请求重新加载和编译每个包含的文件


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

我已经有一段时间没有使用php了,但是Zend优化器或缓存在这种情况下不应该有帮助吗?php是否仍然为每个请求重新加载和编译每个包含的文件


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

如果你想成为真正的硬核,做一些静态分析,弄清楚什么时候需要什么库,并且只包括那些库

如果使用include和not include_一次,那么也可以节省一些速度


尽管如此,Matt关于Zend Optimizer的回答是正确的。如果您愿意,可以尝试高级PHP缓存APC,这是一种操作码缓存,并且是免费的。它应该放在PECL存储库中。

如果你想得到真正的核心,做一些静态分析,弄清楚什么时候需要什么库,并且只包括那些库

如果使用include和not include_一次,那么也可以节省一些速度


尽管如此,Matt关于Zend Optimizer的回答是正确的。如果您愿意,可以尝试高级PHP缓存APC,这是一种操作码缓存,并且是免费的。它应该在PECL存储库中。

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

理想情况下使用字节码缓存APC,以便PHP不需要在每次页面加载时解析库。请注意,使用自动加载将否定使用字节码缓存的好处。您可以阅读更多有关这方面的内容

仅在需要时手动管理所有包含项 将include_路径设置为“仅在必须的位置”,默认值为。:/usr/lib/pear/:/usr/lib/php,仅将其指向必须的位置,即php.net/Set_include_路径 不要使用自动加载,它的速度很慢,使APC和等效缓存作业更加困难 您可以在APC中关闭stat操作,但是每次更新文件时都必须手动清除缓存 仅在需要时手动管理所有包含项 将include_路径设置为“仅在必须的位置”,默认值为。:/usr/lib/pear/:/usr/lib/php,仅将其指向必须的位置,即php.net/Set_include_路径 不要使用自动加载,它的速度很慢,使APC和等效缓存作业更加困难 您可以在APC中关闭stat操作,但是每次更新文件时都必须手动清除缓存
您可以使用spl_autoload_register或u autoload创建您需要的任何规则,以包括cl所需的文件 然而,自动加载引入了自己的性能开销。您需要确保使用php.ini设置或apache配置在所有gui页面前添加您所使用的内容

对于具有泛型函数的文件,我建议您将它们包装在一个实用程序类中,并执行一个简单的查找和替换操作,将所有函数调用替换为util::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');
        }
    }
}

您可以使用spl_autoload_register或u autoload来创建任何规则,以包括类所需的文件,但是autoload会带来自身的性能开销。您需要确保使用php.ini设置或apache配置在所有gui页面前添加您所使用的内容

对于具有泛型函数的文件,我建议您将它们包装在一个实用程序类中,并执行一个简单的查找和替换操作,将所有函数调用替换为util::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');
        }
    }
}
使用一个。如果你试图在没有措施的情况下进行优化,那么你就是在盲目工作。

使用一种方法。如果你试图在没有措施的情况下进行优化,那么你就是在盲目工作。

你想要的是什么

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

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

你想要的是什么

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


你可以读更多关于它的内容。

我其实也在想同样的事情。我没有注意到我在使用自动加载功能时有任何严重的开销,这对我很有帮助。我猜是因为海报上说自动加载不起作用,因为它们混合了函数和类。我的答案是在对问题进行编辑之前发布的,所以肯定还有另外一个原因。这就是为什么我个人否决了答案。当我意识到自动加载不起作用的规范直到后来才添加时,我删除了下一票。实际上我也在想同样的事情。我没有注意到我在使用自动加载功能时有任何严重的开销,这对我很有帮助。我猜是因为海报上说自动加载不起作用,因为它们混合了函数和类。我的答案是在对问题进行编辑之前发布的,所以肯定还有另外一个原因。这就是为什么我个人否决了答案。当我意识到自动加载不起作用的规范直到后来才添加时,我删除了下一票。好的,我们将在清除包含文件后尝试APC。谢谢当结果出来时,我会在这里更新。弗雷德里克,你能推荐一个学习APC的好资源吗?为什么自动加载会把它弄糟?我以前从来没有听说过APC,PHP.net页面也不太清楚它在应用程序开发中的位置。好的,我们将在清理include文件后尝试APC。谢谢当结果出来时,我会在这里更新。弗雷德里克,你能推荐一个学习APC的好资源吗?为什么自动加载会把它弄糟?我以前从未听说过APC,PHP.net页面也不太清楚它在应用程序开发中的位置。谢谢。当结果可用时,我将在此更新。我们已经有Zend Optimizer了。谢谢。当结果可用时,我将在此更新。我们已经有Zend Optimizer了。这也是一个很好的答案,谢谢。我会在有结果时更新这里。这也是一个很好的答案,谢谢。当结果可用时,我将在此更新。