PHP 7.4中使用预加载的方法详解


Posted in PHP onJuly 08, 2019

前言

PHP 7.4增加了预加载支持,这一功能可以显着提高代码的性能。

这是一个简单的预加载:

  • 为了预加载文件,您需要编写自定义PHP脚本
  • 此脚本在服务器启动时执行一次
  • 所有预加载的文件都可在内存中用于所有请求
  • 在重新启动服务器之前,对源文件所做的更改不会产生任何影响

让我们深入研究一下。

Opcache,但更多

虽然预加载是在顶级操作opcache上构建的,但它并不完全相同。Opcache将获取您的PHP源文件,将其编译为“操作码”,并将这些编译后的文件存储在磁盘上。

您可以将“操作码”视为代码的低级表示,可以在运行时轻松解释。因此,opcache会跳过源文件之间的转换步骤以及PHP解释器在运行时实际需要的内容。一场巨大的胜利!

但是,还有更多的东西可以获得。Opcached文件不了解其他文件。如果你有一个A从类扩展的类B,你仍然需要在运行时将它们链接在一起。此外,opcache执行检查以查看源文件是否已被修改,并将基于此文件使其缓存无效。

所以这就是预加载发挥作用的地方:它不仅将源文件编译为操作码,还将相关的类,特征和接口链接在一起。然后,它将保留这个“已编译”的可运行代码blob - 即:PHP解释器可用的代码 - 在内存中。

当请求到达服务器时,它现在可以使用已经加载到内存中的部分代码库,而没有任何开销。

那么,我们谈论的是“代码库的哪些部分”?

在实践中预加载

为了使预加载工作,开发人员必须告诉服务器要加载哪些文件。这是通过一个简单的PHP脚本完成的,所以没有什么可怕的。

规则很简单:

  • 您提供了一个预加载脚本,并使用您的php.ini文件链接到它 opcache.preload
  • 您要预加载的每个PHP文件都应该opcache_compile_file()从preload脚本中传递到

假设您想要预加载一个框架,例如Laravel。您的脚本必须遍历目录中的所有PHP文件vendor/laravel,并逐个包含它们。

以下是您在php.ini中链接到此脚本的方法:

opcache.preload=/path/to/project/preload.php

这是一个虚拟实现:

$files = /* An array of files you want to preload */;

foreach ($files as $file) {
 opcache_compile_file($file);
}

请注意opcache_compile_file,您也可以使用include该文件代替使用。虽然似乎有一个bug,因为在编写时这似乎不起作用。

警告:无法预加载未链接的类

坚持下去,有一个警告!为了预先加载文件,还必须预先加载它们的依赖项 - 接口,特征和父类。

如果类依赖项有任何问题,您会在服务器启动时注意到它:

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会添加支持,这样你就不必自己制作预装文件了,而且这个功能很容易在服务器上设置,因为你可以完全控制它。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
一段php加密解密的代码
Oct 09 PHP
在WIN98下以apache模块方式安装php
Oct 09 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
简单的php文件上传(实例)
Oct 27 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
php apache开启跨域模式过程详解
Jul 08 #PHP
php如何把表单内容提交到数据库
Jul 08 #PHP
php利用array_search与array_column实现二维数组查找
Jul 08 #PHP
php实现获取近几日、月时间示例
Jul 06 #PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 #PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 #PHP
php中isset与empty函数的困惑与用法分析
Jul 05 #PHP
You might like
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
PHP正则验证Email的方法
2015/06/15 PHP
php把数组值转换成键的方法
2015/07/13 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
python Django批量导入数据
2016/03/25 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
Python实现手势识别
2020/10/21 Python
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
机关副主任个人四风问题整改措施
2014/09/26 职场文书
考研复习计划
2015/01/19 职场文书
布达拉宫的导游词
2015/02/02 职场文书
学年个人总结范文
2015/03/05 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
生产车间管理制度
2015/08/04 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
python Polars库的使用简介
2021/04/21 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python