intahwebz / lowmemoryclassloader
一个使用极少量内存的PHP类加载器。
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,其性能与真实服务器差异很大,因此我不会提出任何我知道是不可靠的基准。