坚持下去,有一个警告!为了预先加载文件,还必须预先加载它们的依赖项 - 接口,特征和父类。
如果类依赖项有任何问题,您会在服务器启动时注意到它:
Can't preload unlinked class
Illuminate\Database\Query\JoinClause:
Unknown parent
Illuminate\Database\Query\Builder
请参阅opcache_compile_file()解析文件,但不执行它。这意味着如果一个类具有未预加载的依赖项,则其本身也不能被预加载。
这不是一个致命的问题,您的服务器将正常工作; 但是你不会拥有你真正想要的所有预装文件。
这就是为什么你应该注意要预加载哪些文件,以确保解决所有依赖项。手动执行此操作可能看起来像是一件苦差事,所以很自然人们已经在开发自动化解决方案。
Composer支持
最有前途的自动化解决方案来自composer,现在已经被大多数现代PHP项目所使用。
人们正在努力添加预加载配置选项composer.json,进而为您生成预加载文件!就像预加载一样,此功能仍在进行中,但可以在此处进行操作。
幸运的是,如果你不想,你将不需要手动配置预加载文件,composer将能够为你做到这一点。
服务器要求
关于使用预加载时的devops方面,还有两个更重要的事情需要提及。
您已经知道需要在php.ini中指定一个条目才能使预加载工作。这意味着如果您使用共享主机,则无法根据需要自由配置PHP。
实际上,您需要一个专用(虚拟)服务器才能为单个项目优化预加载的文件。所以记住这一点。
还要记住php-fpm,每次要重新加载内存中的文件时,都需要重新启动服务器(如果你正在使用它就足够了)。这对大多数人来说似乎是显而易见的,但仍值得一提。
性能
现在谈到最重要的问题:预加载实际上是否提高了性能?
答案是肯定的,当然:Ben Morel分享了一些基准,可以在与之前相关的同一个composer问题中找到。
有趣的是,您可以决定只预加载“热门类”:代码库中经常使用的类。Ben的基准测试表明,只加载大约100个热门类,实际上比预加载所有产生更好的性能提升。这是性能提升13%和17%的差异。
应该预先加载哪些类依赖于您的特定项目。在开始时尽可能简单地预加载是明智的。如果您确实需要增加几个百分比,则必须在运行时监控代码。
所有这些当然也可以自动化,并且可能在将来完成。
现在,最重要的是要记住,comopser会添加支持,这样你就不必自己制作预装文件了,而且这个功能很容易在服务器上设置,因为你可以完全控制它。