情景
在PHP8.2版本环境下能顺利搭建Flarum1.8.5,但在后台配置SMTP发信,发送测试邮件时,会提示:“糟糕,出错啦,请刷新页面重试。”
有关于Flarum的搭建参照:宝塔面板(aaPanel)搭建Flarum
检查网页端控制台,错误如下:
检查PHP日志,错误如下:
2024/06/10 11:51:34 [error] 25932#0: *24187 FastCGI sent in stderr: "
PHP message: PHP Deprecated: Callables of the form ["Swift_SmtpTransport", "Swift_Transport_EsmtpTransport::__construct"] are deprecated in
/www/wwwroot/wadao.net/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php on
line 36;
PHP message: PHP Deprecated: Callables of the form ["Swift_Message", "
Swift_Mime_SimpleMessage::__construct"] are deprecated in
/www/wwwroot/wadao.net/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Message.php on line 46;
PHP message: PHP Fatal error: Uncaught Laminas\HttpHandlerRunner\Exception\EmitterException: Output has been emitted previously; cannot emit response in /www/wwwroot/wadao.net/vendor/laminas/laminas-
httphandlerrunner/src/Exception/EmitterException.php:20
错误原因
Flarum依赖的SwiftMailer库
包含了一些 PHP8.2已弃用的功能,例如以ClassName, 'methodName'
形式使用的回调,以及动态属性创建。
经测试,在纯净的Flarum程序上,会出现发送测试邮件报错、更改邮箱报错,此处理方法仅能解决测试邮件报错。同时,很多适配于1.8.5版本的Flarum扩展插件将会引发报错,例如fof/likes、mattoid/flarum-ext-money-history、littlecxm/whisper、fof/mentions(空内容发帖/回复)
等,需要等待Flarum后续版本更新依赖。
解决方法
方法一、安装Swiftmailer fork
Swiftmailer可以在最高达8.1版本的PHP上运行,但不支持更高版本。
Swiftmailer分支swiftmailer-legacy
,可以在 PHP 8.2 上运行而不会出现任何弃用警告。
有关此分支详情:Swiftmailer on PHP 8.2
升级方法:
composer require viaaurea/swiftmailer-legacy -W
这将替换原始软件包,而不会破坏其他依赖于正在安装的Swiftmailer软件包的需求。该分支是完全兼容的原始Swiftmailer的直接替代品,只需最少的代码更改即可支持PHP8.2。
安装完成后,再次发送测试邮件便不会出现报错。但此方法只适用于解决SwiftMailer库引发的问题,更多由动态属性创建等引发的报错不会得到解决。
方法二、关闭PHP错误信息输出
由于各错误并不影响程序的实际运行,我们可以通过关闭display_errors来隐藏警告。
在/public/中创建php.ini,屏蔽错误信息。内容如下:
display_errors = Off
log_errors = On
error_log = /var/log/php-error.log
若为宝塔面板,直接在PHP管理——配置修改——display_errors
中关闭
即可。
php都8.2了,更新好快呀。
夏日博客 06-12
是的~ 不过还是不要追求太新的好,好多不兼容。
bluish 06-12 回复 @夏日博客