intahwebz/lowmemoryclassloader

一个使用极少量内存的PHP类加载器。

1.0.1 2014-02-15 20:36 UTC

This package is auto-updated.

Last update: 2024-09-12 03:38:39 UTC


README

一个兼容PHP Composer的类加载器,使用更少的内存。

为什么

我曾经是一名视频游戏开发者。我无法忍受看到在不必要的时候占用大量内存。

在我当前项目上运行 composer--optimize-autoloader update 之后,类加载器的'优化'版本看起来像这样:[http://pastebin.com/Xa1ii7PY](http://pastebin.com/Xa1ii7PY),坦白说让我感到震惊。它占用了645kB的内存,这大约是我所使用的框架中显示一个页面所需的内存的30%。

尽管需要对确定类文件位置进行某种优化(因为file_exists()调用太慢,必须不惜一切代价避免),但我们真的应该比使用那么多的内存做得更好。

此外,Composer不会缓存它未安装的类文件的位置。例如,你在项目中使用的所有生成的类都有一个为每个请求执行的file_exists()调用。LowMemoryClassloader会缓存这些调用。

它的工作原理

OPCache存储PHP文件的优化版本。我们可以将其用作缓存,以存储先前PHP脚本中已经加载的文件,这实际上为我们提供了一个缓存,它包含哪些文件包含哪些类,从一个小的可用可能性列表中。

因此,我们不必存储所有类单个文件的庞大列表,而只需使用来自文件autoload_namespaces.php的顶级命名空间列表的更短的列表来搜索文件一次,然后,有效地通过OPCache缓存结果。

只有在PHP尝试加载OPCache未缓存的、未命名空间化的类时,才会加载完整的类映射文件。

LowMemoryClassloader要求你使用我从https://github.com/Danack/ZendOptimizerPlus分叉的OPCache,因为它添加了opcache_script_cached($scriptName)函数,允许你检查脚本是否在OPCache中缓存。

如何使用它

  • 编译修改后的OPCache版本。

  • 在你的PHP脚本中,无论何时你包含Composer类加载器require_once('../vendor/autoload.php');,用LowMemoryClassLoader替换它require_once('../vendor/intahwebz/lowmemoryclassloader/LowMemoryClassloader.php');

  • 这就完成了。

与Composer的行为差异

与Composer自动加载器相比,已知的行为差异是,当LowMemoryClassloader无法加载类的文件时,它不会缓存这一事实,并且将在下次尝试加载它时再次尝试查找该类。我认为这是正确的行为,因为它使运行时代码生成更容易处理。

待办事项

将其与Composer附带的类加载器进行比较。它应该对至少中等负载的机器有显著的速度提升。对于使用动态生成类且具有Composer类加载器高开销的应用程序,它肯定会更快。

然而,我在笔记本电脑上的虚拟机上运行PHP5.5,其性能与真实服务器差异很大,因此我不会提出任何我知道是不可靠的基准。