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

问题描述:

对于我们的在线游戏,我们已经写了大量的PHP类和功能,按照主题分组在文件和文件夹中。最后,我们在我们称为libs的一组文件中包含我们所有的后端代码(逻辑&数据库访问层),并在我们的GUI(网页,表示层)中使用include include include('pathtolib /file.inc')如何创建一个快速的PHP库?

问题是我们一直懒惰的包含和大多数include语句在我们的libs文件中产生,从每个网页,每次我们包含任何库文件,我们实际上加载整个库,文件逐个文件。

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

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

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

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

  • 管理所有包括手动,只需要在那里
  • 设置你的include_path只在那里它必须是,默认的是一样的东西:/ usr/lib中/梨/:/ usr/lib中/ PHP,仅在它必须是点吧,php.net/set_include_path
  • 不要使用自动加载,它的速度慢,使APC和等效缓存的工作变得更加困难
  • 您可以关闭“STAT”以诚合作APC,但必须在每次更新文件时手动清除缓存

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

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

+0

我实际上想知道同样的事情。在使用__autoload函数时我没有注意到任何严重的开销,它对我很好。 – Twan 2008-09-18 15:11:09

+0

当然我也对答案感兴趣。 – Veynom 2008-09-18 16:01:38

+0

我的猜测是downvote是因为海报称自动加载不会工作,因为他们有功能和类的组合。 – 2008-09-18 16:42:33

自从我使用php以来已经有一段时间了,但是在这种情况下Zend Optimizer或Cache不应该有什么帮助吗? php是否仍然加载&为每个请求重新编译每个包含的文件?

我不确定自动加载是否是答案。如果包含这些文件,它们可能需要包括它在内的类,所以它们仍然会自动加载。

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

如果您使用的是include而不是include_once,那么这里也有一些速度节省。

所有这一切,马特关于Zend Optimizer的回答是正确的。如果你想要的话,试试高级PHP缓存(APC),这是一个操作码缓存,并且是免费的。它应该在PECL存储库中。

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

您可以使用spl_autoload_register()或__autoload()来创建包含类所需文件所需的任何规则,但autoload会引入其自身的性能开销。你需要确保你使用的所有东西都是使用php.ini设置或apache配置预先设置的。

对于具有泛型函数的文件,我建议您将它们包装在实用程序类中,并执行一个简单的查找和替换操作,以便使用util :: function()替换所有函数()调用,自动加载这些函数(再次,调用方法而不是全局函数引入了开销)。

基本上,最好的办法是通过代码返回并通过修复包含问题来还清设计债务。这会给你最的性能优势,它可以让你做最喜欢eAccelerator在,Zend的平台和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'); 
     } 
    } 
} 

使用profiler 。如果你尝试优化而没有采取措施,你就会盲目工作。

您要找的是Automap PECL extension

它基本上允许在加载预先计算的地图文件时只需很小的开销即可自动加载。如果你知道一个特定的目录只能从某些PHP文件中提取,你还可以对地图文件进行细分。

您可以阅读更多关于它here