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

时间:2020-03-06 14:21:44  来源:igfitidea点击:

对于我们的在线游戏,我们编写了许多PHP类和函数,这些类和函数按主题分组在文件中,然后在文件夹中。最后,我们现在将所有后端代码(逻辑和数据库访问层)包含在一组称为libs的文件中,并使用include_once('pathtolib / file)将libs包含在GUI(网页,表示层)中。公司")。

问题在于,我们一直对包含项感到很懒惰,并且大多数include语句是在我们的libs文件中做出的,从而导致每个网页中,每当我们包含任何libs文件时,我们实际上都是逐个文件地加载整个libs。

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

  • 从libs文件中删除所有include语句,仅从网页中调用必要的语句?
  • 还有其他事吗?

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

编辑:我们混合了简单的功能(传统原因和大部分代码)和类。因此,自动加载将是不够的。

解决方案

如果我们已经完成了面向对象的编程,则可以使用自动加载功能,该功能将在调用它们时按需从源文件中加载类。

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

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

我不确定自动加载是否能解决问题。如果包含了这些文件,则在包含它的类中可能会需要它们,因此无论如何它们仍将自动加载。

如果我们想成为真正的核心人物,请进行一些静态分析,并准确找出何时需要什么库,并且仅包括这些库。

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

话虽如此,Matt关于Zend Optimizer的答案是正确的。如果需要,请尝试免费使用高级PHP缓存(APC),它是一个操作码缓存。它应该在PECL存储库中。

使用字节码缓存(最好是APC),以便PHP无需在每次页面加载时解析库。请注意,使用自动加载将否定使用字节码缓存的好处(我们可以在此处了解更多信息)。

  • 手动管理所有内容,仅在需要时
  • 将include_path设置为仅在必须的位置,默认值为。:/ usr / lib / pear /:// usr / lib / php,仅将其指向必须的位置,即php.net/set_include_path
  • 不要使用自动加载,它会很慢,并且会使APC和等效的缓存作业更加困难
  • 我们可以在APC中关闭"状态"操作,但是每次更新文件时,都必须手动清除缓存

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

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

使用探查器。如果我们不采取措施就尝试进行优化,那么我们就是盲目工作。

我们正在寻找的是Automap PECL扩展。

它基本上允许自动加载,而只需要很小的开销就可以加载预先计算的地图文件。如果我们知道特定目录只会从某些PHP文件中提取文件,则还可以细分地图文件。

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