将您的网站升级到PHP 8
正如许多人所听说的那样,PHP 7已于上个月,11月28日,达到其生命周期结束。您可能也听说这对您网站的安全是一个坏消息,或者升级您的网站到PHP 8是一项枯燥的任务。虽然这两个说法都不是绝对的真理,但每个可能的谎言中总有一些真理的颗粒。让我们看看PHP 7服务生命周期的结束对您的网站意味着什么,以及您在务实、实际的角度上可以做什么。
目录
生命周期结束对PHP意味着什么?
PHP使用类似于Joomla本身的按时间版本发布策略。每年发布一个新版本,并得到两年的主动支持(错误修复和安全修复),以及一年的安全支持(仅安全修复)。受支持的版本在PHP网站上列出,还有一个实用的时间表,告诉您PHP何时进入每个支持阶段——以及何时达到生命周期结束(EOL)。
使用生命周期结束的PHP版本并不立即使您的网站不安全。通常在PHP版本成为EOL和发现针对此PHP版本的安全问题之间存在一些时间。没有办法知道这将持续多久。此外,您的托管公司用于为其服务器供电的Linux发行版将回滚一些安全修复到旧的、生命周期结束的PHP版本。然而,没有办法知道是哪些和什么时候。
基本上,使用生命周期结束的PHP版本给您带来的是安全不确定性。您不可能知道您的网站是否安全,或者何时以及是否将收到针对生命周期结束的PHP版本的安全修复。因此,您的决策最佳做法是将任何PHP生命周期结束版本视为不安全,因此需要尽快升级。
关键要点:当您目前使用的PHP版本进入其安全支持阶段时,始终计划在您的网站上升级PHP。这给了您一年时间去完成它。如果您发现自己正在使用PHP的EOL版本,请立即采取行动。
升级PHP的注意事项
PHP是一种活的语言。它会随着时间的推移而发展。这是必要的,因为我们的软件构建方式以及它被使用的环境也会随着时间的推移而变化。因此,我们过去使用的一些功能会被弃用并最终移除,这会破坏仍然使用它的软件。新功能会被实现,这可能会破坏没有预期到它们的代码。这就是为什么人们可能会告诉你升级网站很困难——他们使用的是过时的软件,这些软件通常早于他们想要升级到的PHP版本。
最终,升级PHP的困难在于您的软件提供商是否愿意投入时间和精力来跟上时代的步伐。作为一个提供软件的提供商,我总是支持在发布之前最新和最好的PHP版本。这不是常态,我无法要求其他开发者达到同样的标准。这当然是可以做到的,但确实很难且非常耗时。经过这么多年,我无法保证我总是做对,尤其是对于一些非常难以在代码中定位的PHP更改,或者与Joomla核心代码不兼容的更改。
对于第三方扩展开发者来说,在Joomla完全支持新PHP版本之后开始支持新PHP版本更为合理和更有可能,通常是在新PHP版本首次发布后的1-2个月内。完成这项工作可能需要1到4个月的时间,具体取决于扩展开发者的资源。这意味着最新和最好的PHP版本在其原始发布后的6到9个月内才对Joomla网站真正实用。由于PHP的新版本通常每年12月发布,所以这将是下一年度的5月至8月。
关键要点:您不应该尝试升级到最新和最好的PHP版本;只需升级到上一个版本。根据您的休假计划,在8月或9月左右,您应该开始规划和测试您迁移到下一个PHP版本的计划。
但是,我不想升级!
这当然是你的选择,但请考虑以下要点。
无论Linux发行版的维护者是否会在某个不确定的时间点将其应用于它,一个EOL版本的PHP最终都会变得不安全。您的PHP版本运行正常且安全,直到它不再安全。如果你想玩这个俄罗斯轮盘游戏,没有人能阻止你。
较新的PHP版本速度更快,导致页面加载时间更短,这对您的搜索引擎评分有积极影响。坚持使用旧版本的PHP会对您的网站搜索引擎优化产生不利影响。
较新版本的Joomla及其扩展不再支持旧版本的PHP。这可能会让您在网站上没有升级路径。请记住,尽管您的Joomla版本本身支持广泛的PHP版本,但这并不一定适用于第三方扩展。例如,当我们注意到我们的用户在使用旧版本的PHP上使用我们的软件不够多,或者支持他们的成本远远超过了任何商业收益(或者变得在实际上完全不可能),或者我们必须确保与较新版本的PHP兼容时,我们公司会停止支持旧版本的PHP。
最后,您的网站是运营成本,而不是资本支出。维护它的成本是网站TCO(总拥有成本)的关键组成部分。如果您不愿意承担这种成本,还有成本较低的静态网站(功能较少),以及更受限制且更昂贵的网站构建平台(但可以节省您维护网站所需的时间)。简而言之,您不能既要又要。这就是生活。
制定持续PHP升级计划
基于上述两个关键点,已经制定了一个PHP迁移计划。
- 每年一月,检查您每个网站上使用的PHP版本,并将其与活跃的PHP版本进行比较。
- 如果网站使用的是比列出的安全支持版本更旧的版本,请尽快升级。
- 如果网站使用的是列出的安全支持版本,请制定计划,到九月将其升级到上述表格中列出的两个PHP版本中的中间版本。
- 如果网站使用的是那个中间版本,请在八月或九月回过头来看看是否可以将其升级到最新版本的PHP。如果不可能,您将在一月回过头来。
如果您有更多的网站,您可能需要分阶段制定您的计划。但是,您必须始终有一个计划。
如果您是网站集成商,务必向客户解释您的计划,以及任何注意事项(例如,如果某些您使用的扩展不支持较新的Joomla和PHP版本,您将不得不为它们报价部分重建),当您向他们销售支持合同时。您确实向客户销售了支持合同,对吧…?
升级您的网站
虽然以下内容看起来可能很多,但实际上并不多。您将阅读的大部分内容都是关于为什么您要这样做以及故障排除。
您的Joomla升级计划如下
- 升级Joomla及其所有扩展,包括您的模板。
- 确保您的扩展支持新的PHP版本。
- 确保当前和新的PHP版本之间的PHP设置相同。
- 升级PHP。
- 如果网站崩溃,将错误报告设置为最大值,以找出什么出了问题以及原因。
在升级之前
在您开始考虑升级PHP版本之前,您需要确保所有软件都与其兼容:Joomla本身、所有扩展以及您的模板(特别是如果它基于第三方模板框架)。
请记住,在某个PHP版本发布之前发布的软件绝对不会支持该PHP版本!开发者不是先知。在我们知道PHP或Joomla将如何变化之前,我们无法支持PHP或Joomla的未来版本。对于较新版本,请咨询您的扩展或模板的开发者,以找出他们的软件支持哪些版本的Joomla和PHP。十多年前,我从桌面软件发布者那里复制了软件的版本兼容性矩阵的想法。许多开发者也复制了这个想法,或者在他们的文档或下载区域提供兼容性信息。请在提交请求之前检查开发者的网站。
不幸的是,Joomla本身并没有列出每个版本的PHP版本与哪些版本兼容。始终选择最新发布的版本。在撰写本文时,它是Joomla 4.2.6,与PHP 8.1兼容,并初步支持PHP 8.2(某些弃用通知是问题,但它们正在积极解决)。
话虽如此,但请记住,Joomla 3.10目前处于安全维护状态。因此,它将不会在PHP 8.1以上版本上正确工作。如果您有一个Joomla 3.10网站,您已经错过了应该制定升级计划的时间。到2024年12月,您将有一个在已过时的PHP版本上运行已过时Joomla版本的网站——并且您将没有升级路径,需要从头开始重建。
在升级之前配置PHP版本
您的服务器上的每个PHP版本都有自己的配置,由独立管理。在我一生中,我从未见过一个在不同PHP版本之间具有一致配置的主机,更不用说从上一个PHP版本复制配置到新版本的主机了。
有一些配置设置需要从您当前的 PHP 版本的配置复制到您的新 PHP 版本的配置中(顺便看看它们的作用吧)
- 已启用的扩展。Joomla及其扩展使用的许多PHP功能——例如数据库(MySQL或PostgreSQL)支持、JSON支持、XML支持、ZIP/压缩支持、图像处理支持、mb_string(Unicode)支持等——都不是PHP语言的组成部分。它们是PHP语言的扩展。扩展是可选的,必须显式启用。默认情况下,PHP不能用于运行网站;需要有人告诉它启用所需的扩展。这令人震惊,我知道!
- 最大执行时间。这决定了PHP应用程序(如Joomla)在向浏览器返回任何内容之前可以消耗的最大时间。一些服务器默认值非常低,为5到10秒,这对于像发送通讯、调整图像或备份数据这样较长的操作来说是不够的。通常需要30到60秒。
- 最大允许内存。每次有人访问您的网站时,Joomla都需要加载自身、相关的Joomla扩展和相关的数据库数据到内存中,在内存中构建HTML页面,并将其返回到Web服务器,由Web服务器发送到浏览器。默认情况下,大多数服务器使用大约32 MiB的低值,这对于非常轻量级的网站几乎足够。更现实的内存大小大约为128 MiB。
- 最大上传文件大小。新PHP版本的默认值为2 MiB,当您需要上传大文件(如现代智能手机或数码单反相机拍摄的图片)或使用上传和安装方法安装的大多数非平凡Joomla扩展时,这不够用。为了安全起见,需要大约10 MiB。如果您想在Joomla更新中使用上传和更新方法,则需要将此设置为32 MiB——它必须足够大,以便上传最大的Joomla升级包。
- 最大POST大小。这也与上传以及编辑长文章有关。它应至少与最大上传文件大小相同。如果您想允许同时上传多个文件,例如在论坛或帮助台组件中,您应将其设置为最大上传文件大小的倍数,乘以您希望一次性上传的最大文件数量。例如,如果您有最大上传大小为10 MiB,并希望一次性上传最多5个文件,则需要将其设置为10 × 5 = 50 MiB。
- PHP临时路径。这不同于Joomla的临时文件夹。这是PHP内部用于处理上传文件以及一些其他辅助功能的路径。这应该是一个您的网站可以写入的路径。
- PHP会话路径。如果您打算在Joomla的全局配置中使用“PHP”方法处理会话,则此路径必须是您的网站可以写入的。
大多数主机在其托管控制面板中提供界面,以让您自己管理这些设置。检查您当前的PHP版本设置并记录下来。然后转到您将要升级到的新的PHP版本的设置,并将这些设置复制过来。
如果您不知道如何操作,或者您的托管商不提供此类界面,请要求托管商操作。这实际上是您支付给他们为您做的事情的一部分。
升级PHP
现在,是时候升级PHP了!在大多数主机上,这可以通过托管控制面板界面完成。如果您不确定如何操作,请咨询您的托管商。他们肯定有相关文档,如果找不到,他们会指向它。
哎呀!它坏了!
正如《银河系漫游指南》的封面著名地读到的
不要慌张.
您始终可以切换回之前的PHP版本。如果您的网站必须在线,请这样做。然后创建您网站的副本——例如,使用您的托管提供商的“开发站点”功能,或者如果没有此类功能,使用第三方工具如Akeeba Backup——这样您就可以在网站的次要副本上执行下一步操作。
您需要首先确定的是,“它坏了”是什么意思?
如果您看到很多看起来很可怕的文字,比如“已弃用”、“注意”和“警告”,那么您很可能在全局配置中将错误报告设置设置成了除“无”以外的任何选项。如果您能登录到您网站的后端,请登录,转到系统、全局配置、服务器选项卡,将错误报告设置为“无”,点击保存并关闭。再次访问网站的首页。如果可以工作,那么您就完成了。
如果您无法访问您网站的后端,请编辑您网站上的configuration.php
文件。找到包含$error_reporting
的行,并将其更改为
public $error_reporting = 'none';
再次访问网站的首页。如果可以工作,那么您就完成了。
如果您看到一条消息,表明Joomla无法启动会话或无法建立数据库连接,请检查新PHP版本的PHP配置。我们之前讨论过这个问题。前者消息表示您的网站无法写入PHP会话路径,或者PHP在其配置中未启用用于数据库支持的扩展(通常称为mysqlnd
)。后者错误肯定表示未启用用于数据库支持的PHP扩展。
您是否看到一个带有鬼魂和大量文字的可怕红色页面?这实际上是一件好事。这意味着您正在查看详细的错误报告。我们稍后会回到这个问题。如果您只看到空白页面,或者服务器页面显示500内部服务器错误,您需要启用网站调试。如果您能登录到您网站的后端,请转到系统、全局配置、系统选项卡,将调试系统设置为“是”。点击服务器选项卡,将错误报告设置为“最大”。如果您无法访问您网站的后端,请编辑您网站上的configuration.php
文件。找到包含$error_reporting
和$debug
的行,并分别更改它们
public $error_reporting = 'maximum';
public $debug = true;
注意!这样做将向任何可以查看这些页面的人暴露有关您网站配置的潜在敏感信息。建议您只在网站的副本上这样做。
重新加载页面,您将看到一个带有鬼魂和大量文字的可怕红色页面。这是用于故障排除的详细Joomla错误报告页面。它告诉开发者什么出了问题。
如果您在顶部看到一个消息,表明找不到函数/函数未定义,那么问题是Joomla本身使用的PHP扩展或第三方扩展未在PHP配置中启用。请查看关于从旧到新PHP版本复制PHP配置的早期部分;如果您自己找不到问题,可能需要向您的托管提供商求助。
如果出现解析错误,或者关于声明不兼容的消息,这意味着您正在尝试使用的PHP新版本与Joomla或其扩展不兼容。发生错误的最后加载的文件位于页面的顶部。这将告诉您是Joomla本身还是扩展有问题。无论如何,您都需要回到之前的PHP版本,升级Joomla或第三方扩展。如果您已经升级了所有扩展(包括模板及其所使用的任何模板框架),您需要联系扩展的开发者。发送您收到的完整错误报告,并询问他们对支持新PHP版本的计划。错误报告将帮助他们了解他们的扩展是否真的是问题所在,如果是的话,是什么问题,并修复它。请记住,未报告的错误是无法修复的错误。
顺便提一下:如果您尝试升级到最新的PHP版本,在发布的最初6到9个月内,您的生活可能会非常糟糕,因为Joomla和第三方扩展都不会提供任何实际的支持。在这种情况下,尝试使用立即之前的PHP版本。还记得我们之前说的吗?总是选择PHP支持版本页面中的中间版本。
最后润色
如果您网站使用CLI脚本的CRON作业(例如通过cli/joomla.php
Joomla CLI应用程序),您还需要编辑您的CRON作业。请记住,您的CRON作业命令行的第一部分是您想要与CRON作业一起使用的PHP版本的PHP CLI可执行文件路径。现在您已经升级了网站的PHP版本,您还需要通过更改该路径来升级CRON作业的PHP版本。将它更改为什么?通常这些路径遵循一个模式,例如PHP 8.0为/usr/bin/ea-php80
,PHP 8.1为/usr/bin/ea-php81
等等。如果不确定,请咨询您的托管服务提供商。
如果您使用的是Admin Tools的.htaccess Maker之类的工具,请记住,一旦您重新生成.htaccess文件,您的网站将恢复到之前的版本或服务器的默认PHP版本。您知道,在大多数服务器上,更改PHP版本所做的只是更改您的.htaccess文件末尾的一些行。以下是我升级到PHP 8.1后在我的博客网站上看到的情况
# php -- BEGIN cPanel-generated handler, do not edit
# Set the <E2><80><9C>ea-php81<E2><80><9D> package as the default <E2><80><9C>PHP<E2><80><9D> programming language.
<IfModule mime_module>
AddHandler application/x-httpd-ea-php81 .php .php8 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit
您需要按照其文档将AddHandler application/x-httpd-ea-php81 .php .php8 .phtml
行复制到Admin Tools的.htaccess Maker页面。如果您使用不同的扩展或某些其他工具来管理您的.htaccess文件,您将需要进行类似的操作。请检查您工具的文档。
这对我来说仍然很难
不熟悉的东西很难。没有计划很难。试图记住所有的事情很难。
那么什么让它变得容易呢?
清单、文档和实践。
尽管有传言,但我既不是机器人,也不是超人。我不仅和普通人一样,而且还患有ADHD,这使得记住事情和集中注意力更加困难。这就是我编写文档和制作清单的原因。
记录每个网站上运行的内容以及它支持的Joomla和PHP版本。因此,在开始升级PHP之前,您将知道要升级什么。
在每个不同的主机上使用非关键网站来熟悉PHP升级过程。记下笔记,然后将其变成清单。当您想要升级PHP时,您可以像飞行员一样遵循清单。确保包括即使是显而易见步骤的清单步骤。稍后感谢我。
当您不可避免地遇到问题时,使用本文中的故障排除信息来找到解决方案。记录问题和解决方案,这样下次您就不必尝试回忆一年或两年前做了什么。如果问题在回顾中是可以预防的,请调整您的清单。
以下是一个清单的大致内容,以帮助您开始
- 信息检查
- 查找您扩展的版本
- 检查哪些扩展支持哪些Joomla和PHP版本
- 准备PHP
- 从当前版本复制PHP设置到新的PHP版本
- 升级Joomla
- 升级扩展(包括模板)
- 使用Joomla的扩展更新功能
- 如何升级不使用Joomla扩展更新功能的扩展
- 升级PHP。
- 在您的托管环境中升级PHP的逐步过程
- 升级后
- 更新CRON作业
- 将.htaccess设置复制到Admin Tools或其他第三方工具
顶级条目是标题,或者您喜欢的话,也可以是子检查列表。二级条目需要逐步说明。请提供尽可能多的细节
保持安全,升级您的网站,并友好对待彼此。
在Joomla社区杂志上发表的一些文章代表了作者在特定主题上的个人观点或经验,可能不代表Joomla项目的官方立场
版权
© 版权 2022 Nikolaos K. Dionysopoulos。保留所有权利。在Creative Commons BY-NC 4.0许可下分发。
通过接受,您将访问由 https://magazine.joomla.net.cn/ 之外的第三方提供的服务
评论 7
太棒了!非常感谢这个详细的教程!我多么希望在上个星期天升级到PHP 8.1之前就能看到它?我已经截图了PHP设置,看起来它们在cPanel中自动转换到了新版本。但我会回去再次检查,确保一切按照您在这里的建议进行。另外,我根本不知道更新AT中的.htaccess会影响PHP版本(将其还原)。我必须仔细检查这一点。非常感谢!
在我发布第一条评论后,我现在检查了我的.htaccess文件。自从我前几天通过cPanel升级到PHP 8.1后,我想检查可能被添加到我的.htaccess文件中的部分。但我的.htaccess文件中既没有AddHandler也没有SetHandler。此外,文件的修改日期是在我上一次使用Admin Tools生成它的时候,即10月底。
那么这是好事还是坏事呢?这必须意味着当我在cPanel中更改PHP版本时,我的主机不会使用编辑.htaccess的那种方法,对吗?
尽管设置PHP版本最常见的方法是修改网站的.htaccess文件,但您说得对,并非所有主机都使用这种方法。一些主机可能会在您的网站根目录的父目录中使用.htaccess文件。其他主机可能会修改虚拟主机配置并重启服务——特别是使用虚拟化进行网站托管的主机。有些主机可能会简单地交换“默认”PHP版本的符号链接并重新加载服务。
由于我所看到的绝大多数主机都依赖于修改网站根目录中的.htaccess文件,我决定在文章中将此作为真理添加,以帮助人们捕捉到潜在的问题,而不会用技术细节和条件语句让他们感到困惑。
感谢您提供更多信息。这非常有用!
我尝试升级到8.1,但PHPMailer不再工作。这似乎是一个已知的问题 https://github.com/php/php-src/issues/8086。我们的托管公司无法解决这个问题 - 似乎是一个MTA问题。有线索吗?
PHPMailer,由Joomla的Joomla\CMS\Mail\Mail API使用,在PHP 8.1中运行良好。
你似乎链接到了一个关于PHP的mail()函数的问题报告。如果你仔细阅读讨论,你会看到问题最终是你在使用的sendmail实现中的一个错误。这与Joomla、PHPMail或PHP本身无关。问题是托管者的sendmail实现不遵守互联网标准。这个问题以前已经报告过,从2002年(在PHP 8.1之前十九年),答案仍然是相同的:任何不遵守互联网标准的邮件传输代理都存在问题。这是准确且公平的。
一个简单且直接的解决方案是将Joomla配置为使用SMTP。这样就不会再使用sendmail,因此你将绕过托管者破损的sendmail问题。
更好的是,换一个真正关心标准的托管者。如果你在寻找新的托管者,请检查joomla.org页面的底部?
嗨Anna Robinson,
感谢你与Nicholas一起在这里分享你的技能。
请问我可以提供一些额外的步骤,特别是我具体需要更改什么以及在哪里找到需要更改的内容!
我已经感谢你的热心帮助。