PHP-FPM、MariaDB和Symfony Form Doctrine查询生成器的非常奇怪的行为(错误503)



我提前道歉,我无法对这个问题进行更好的分类,但这种行为令人困惑,以至于我不知道问题可能来自哪里。几个小时后,我们和另一个开发人员一起试图对其进行错误修复,但没有成功。我们不知道这个问题是源于数据库还是PHP(很明显,当这两者试图通信时出现了问题)。我们希望也许有人也有类似的经历,至少能给我们指明一些方向。

这似乎更多的是一个基础设施问题,而不是与代码相关的问题,但谁知道呢。


系统:‎CentOS 7 VPS,PHP-FPM 8.1,Symfony 6.0.11,MariaDB 10.2.38

重要信息:当Symfony设置为dev环境时,一切正常。问题仅在切换到prod时出现。


关闭Symfony的FormType中的代码(请求生命周期中的其他代码似乎无关紧要,删除下面的代码完全消除了问题,PHP和MariaDB之间的通信似乎可以处理所有其他查询)。

$builder
->add('type', EntityType::class, [
'class' => Property::class,
'choice_label' => 'name',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('p')
->orderBy('p.name', 'ASC');
}
])


浏览器输出:
503服务不可用
由于维护停机或容量问题,服务器暂时无法为您的请求提供服务。请稍后再试

服务器日志:
AH01067:读取FastCGI标头失败
(104)对等方重置连接:[client REDACTED-IP:53320]AH01075:将请求发送到:
时出错

PHP日志:
警告:[pool admin]child 1770在启动后1.360270秒后退出信号11(SIGSEGV)

数据库日志:
[警告]中止与db:REDACTED用户:REDACTED主机:localhost的连接2787505(读取通信数据包时出错)


当然,我们也尝试过:

  • 重新启动整个VPS
  • rm-r var/cache对Symfony缓存的硬删除
  • 禁用OPcache(一些谷歌搜索暗示了这种关系)

让我质疑自己理智的部分:当我从上面的代码中删除整个orderBy子句时,它就开始工作了。更令人震惊的是,当我将orderBy('p.name', 'ASC')更改为orderBy('p.name', 'DESC')时,它也开始工作了(原文如此!)。当我将p.name更改为其他有效属性,但仍使用ASC排序时,它不起作用。在这种情况下,我将ASC更改为DESC,它就起作用了!

在创建了一些模拟测试过程并对这些过程产生的核心转储文件进行了进一步分析后,我们偶然发现了类似于的东西

程序终止,信号为11,分段故障
#0 0x00007f9a3954b0d0英寸??()来自/usr/local/lib/ioncube/ioncube_loader_lin_8.1.so

ionCube Loader的最新版本于8月12日发布:https://www.ioncube.com/loaders.php它似乎是在8月14日自动部署在我们的VPS上的,正是在这个时候,这些奇怪的错误开始出现。因此,我们禁用了ionCube Loader扩展,所有的PHP脚本都能正常工作。

虽然这并不能准确地指出导致PHP因分段错误而死亡的确切代码行,但它至少指出了一个事实,即ionCube Loader 12.0.1与PHP 8.1结合使用可能会导致SIGSEGV错误。不知道代码中会发生什么,因为大多数脚本都能很好地工作,只有一些脚本会在非常奇怪的条件下死亡(正如我最初的帖子所描述的)。但在所有这些情况下,硬崩溃都是由ionCube Loader 12.0.1的存在触发的,它的开发人员应该是那些深入研究这个问题的人(我会确保提交正确的崩溃报告)。

把这个答案留在这里,以防有人遇到类似的问题。

编辑:

截至2023年2月1日,该问题仍然存在。与此同时,Github的一些好心人也遇到了类似的问题,他们不仅证实了我的发现,即这个问题源于ionCube Loader,而且还发现了一种创可贴解决方案,在某些情况下可能会有所帮助,所以我将其留在这里:


config/prod/doctory.yaml(应用程序/构建中的文件命名/位置可能会有所不同)中,将doctory.system_cache_pool的适配器值从cache.system更改为cache.adapter.filesystem,因此看起来如下:

framework:
cache:
pools:
doctrine.result_cache_pool:
adapter: cache.app
doctrine.system_cache_pool:
adapter: cache.adapter.filesystem

在此进行全面讨论:https://github.com/symfony/symfony/discussions/44270

我刚刚遇到了完全相同的问题。

PHP版本:8.1.10Symfony:6.0.8条令/dbal(来自composer lock):3.3.6ionCube加载器:12.0.1

我也经历了同样的结果。如果我把它从";ASC";至";DESC";它工作得很好。当通过";ASC";。在我的情况下,我使用";addOrderBy";方法

最新更新