对于我们的在线游戏,我们已经编写了大量的PHP类和功能,按主题分组在文件和文件夹中。最后,我们现在将所有后端代码(逻辑和数据库访问层)放在一组文件中,我们称之为 libs ,我们在GUI(网页,表示层)中包含我们的库使用 include_once('pathtolib / file.inc')。
问题是我们一直懒惰包含内容,并且大多数include语句都是在我们的libs文件中生成的,从每个网页开始,每次我们包含任何libs文件时,我们实际上都是按文件加载整个库。
这对性能有重大影响。那么什么是最好的解决方案?
服务器使用经典的LAMP堆栈(PHP5)。
编辑:我们有简单的功能(遗留原因和大多数代码)和类。所以自动加载是不够的。
答案 0 :(得分:3)
如果您已经以面向对象的方式完成编程,则可以使用autoload函数,该函数将在您调用它们时按需从源文件中加载类。
编辑:我注意到有人对这两个引用自动加载的答案进行了低估。我们错了吗? __autoload函数的开销是否过高而不能将其用于性能目的?如果有什么我没有意识到这种技术,我真的很想知道它是什么。
答案 1 :(得分:3)
如果你想获得真正的核心,做一些静态分析,并确切地确定何时需要哪些库,并且只包含那些。
如果你使用include
而不是include_once
,那么也可以节省一点速度。
所有这一切,Matt关于Zend Optimizer的回答是对的。如果需要,请尝试使用高级PHP缓存(APC),这是一个操作码缓存,并且是免费的。它应该在PECL存储库中。
答案 2 :(得分:3)
答案 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。如果你试图在没有措施的情况下进行优化,那你就是盲目的。