如何创建快速PHP库?
对于我们的在线游戏,我们已经在文件和文件夹中编写了大量的PHP类和函数,它们按主题进行分组。最后,我们将所有后端代码逻辑和数据库访问层放在一组文件中,我们称之为libs,并将libs包含在GUI网页中,表示层使用include_once'pathtolib/file.inc' 问题是,我们一直懒于包含,大多数包含语句都是在我们的libs文件中进行的,这导致从每个网页,每次包含任何libs文件时,我们实际上都会逐个文件加载整个libs 这对性能有重大影响。因此,最好的解决方案是什么 是否从libs文件中删除所有include语句,并仅从网页中调用必要的语句? 做点别的吗? 服务器使用经典的灯堆栈PHP5如何创建快速PHP库?,php,include,Php,Include,对于我们的在线游戏,我们已经在文件和文件夹中编写了大量的PHP类和函数,它们按主题进行分组。最后,我们将所有后端代码逻辑和数据库访问层放在一组文件中,我们称之为libs,并将libs包含在GUI网页中,表示层使用include_once'pathtolib/file.inc' 问题是,我们一直懒于包含,大多数包含语句都是在我们的libs文件中进行的,这导致从每个网页,每次包含任何libs文件时,我们实际上都会逐个文件加载整个libs 这对性能有重大影响。因此,最好的解决方案是什么 是否从libs
编辑:我们混合了一些简单的函数和大多数代码和类。因此,自动加载是不够的。如果您已经以面向对象的方式完成了编程,那么您可以使用该函数,该函数将在调用类时根据需要从它们的源文件加载类
编辑:我注意到有人对提到自动加载的两个答案都投了反对票。我们错了吗?_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了。这也是一个很好的答案,谢谢。我会在有结果时更新这里。这也是一个很好的答案,谢谢。当结果可用时,我将在此更新。