Yii2 应用程序在升级到 php 7.4 并激活 opcache 后导致对等方重置连接
Yii2 app causes connection reset by peer after upgrade to php 7.4 with opcache activated
我们有一个大型 yii2 应用程序,它 运行 完美地安装在 Debian Docker 容器中,并启用了 nginx + PHP-FPM 7.3 和 opcache。
升级到 PHP 7.4.10 后,一些请求导致“(连接重置)同时从上游读取响应 header”错误。
禁用 opcache 可以解决问题,但这并不是一个真正的选择。我也可以启用 opcache 并将整个 yii2 vendor 文件夹列入黑名单,但这也不是一个选项。
我们还在 Debian VM 上安装了 non-docker PHP-FPM 7.4 + nginx + opcache,这个接缝到 运行 到目前为止没有这样的错误。但是我们需要 Docker 环境进行开发,然后在生产中切换到 docker。
运行 使用 PHP 7.3 + opcache 的测试花费了大约 12 分钟,现在没有 opcache 30 分钟(!)。
我试过了,但没有成功:
- 使用官方 Yii2 docker 图像
- 使用官方 PHP 7.4.10 apache 映像
- 使用带有最新 Nginx 映像的官方 PHP-FPM 7.4.10
- 使用比 'Docker version 19.03.12-ce, build 48a66213fe'
更低版本的 docker
- 在nginx、opcache和php的不同变体中设置几个参数,我在网上发现像ignoring invalid headers for nginx。
- 正在将 PHP 版本降级到 7.4.9 或 7.4.2。
- 试图在我们的代码库中找到并修复导致错误的代码,但在大多数情况下,只是结果内容发生了变化,这意味着相同的控制器操作 运行s 有和没有错误,而只有内容已更改。 Headers 和 HTTP return 代码相同。
我们所有的开发人员机器都有问题,例如 Mac 笔记本、Windows 笔记本和 Linux 使用 Ubuntu 或 Fedora 的笔记本。
我的环境:
- OS: 5.7.19-2-MANJARO
- Docker:19.03.12-ce,构建 48a66213fe
- CPU:英特尔 i7-1065G7
- 内存:16GB
- 固态硬盘:512 GB PCIe NVMe M.2
如果有人有什么建议,甚至知道如何解决这个问题。
更新:
我将我的本地系统配置为 运行 php-fpm 7.4.10 并在 docker 容器中配置 nginx 以使用我的本地(在主机上)php-fpm。
我没有收到任何错误或“连接被对等方重置”事件。
所以对我来说,docker 和 opcache 似乎是个问题。
有谁知道启用 opcache 时 yii2 在做什么以及如何配置它?
更新:
现在我也有来自 gdb 的分段错误的回溯:
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `php-fpm: pool www '.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 zend_gc_delref (p=0x6341203a79726156) at ./Zend/zend_types.h:1041
1041 ./Zend/zend_types.h: No such file or directory.
(gdb) bt
#0 zend_gc_delref (p=0x6341203a79726156) at ./Zend/zend_types.h:1041
#1 i_zval_ptr_dtor (zval_ptr=<optimized out>) at ./Zend/zend_variables.h:43
#2 zval_ptr_dtor (zval_ptr=<optimized out>) at ./Zend/zend_variables.c:84
#3 0x000055fd4809a88c in user_shutdown_function_dtor (zv=<optimized out>) at ./ext/standard/basic_functions.c:5048
#4 0x000055fd48177a25 in zend_hash_destroy (ht=0x7f961acb1150) at ./Zend/zend_hash.c:1541
#5 0x000055fd480a0515 in php_free_shutdown_functions () at ./ext/standard/basic_functions.c:5174
#6 0x000055fd48106445 in php_request_shutdown (dummy=<optimized out>) at ./main/main.c:1905
#7 0x000055fd47fd14dd in main (argc=<optimized out>, argv=<optimized out>) at ./sapi/fpm/fpm/fpm_main.c:1970
回溯引导我找到解决方案,它是 pcov 模块。
禁用它就成功了。
我被指向 opcache 的分段错误的搜索结果误导了,并且在 PHP 7.4 中对 opcache 进行了更改,并且在使用 PHP 7.3 + opcache 时也启用了 pcov 模块。
现在我很幸运它可以在新的 PHP 版本中再次运行-
因为我们只需要 pcov 来生成代码覆盖率报告,我们可以禁用 opcache 来创建代码覆盖率报告。
如果有人对pcov + opcache + PHP 7.4有更多了解,欢迎留言。
我们有一个大型 yii2 应用程序,它 运行 完美地安装在 Debian Docker 容器中,并启用了 nginx + PHP-FPM 7.3 和 opcache。
升级到 PHP 7.4.10 后,一些请求导致“(连接重置)同时从上游读取响应 header”错误。 禁用 opcache 可以解决问题,但这并不是一个真正的选择。我也可以启用 opcache 并将整个 yii2 vendor 文件夹列入黑名单,但这也不是一个选项。
我们还在 Debian VM 上安装了 non-docker PHP-FPM 7.4 + nginx + opcache,这个接缝到 运行 到目前为止没有这样的错误。但是我们需要 Docker 环境进行开发,然后在生产中切换到 docker。
运行 使用 PHP 7.3 + opcache 的测试花费了大约 12 分钟,现在没有 opcache 30 分钟(!)。
我试过了,但没有成功:
- 使用官方 Yii2 docker 图像
- 使用官方 PHP 7.4.10 apache 映像
- 使用带有最新 Nginx 映像的官方 PHP-FPM 7.4.10
- 使用比 'Docker version 19.03.12-ce, build 48a66213fe' 更低版本的 docker
- 在nginx、opcache和php的不同变体中设置几个参数,我在网上发现像ignoring invalid headers for nginx。
- 正在将 PHP 版本降级到 7.4.9 或 7.4.2。
- 试图在我们的代码库中找到并修复导致错误的代码,但在大多数情况下,只是结果内容发生了变化,这意味着相同的控制器操作 运行s 有和没有错误,而只有内容已更改。 Headers 和 HTTP return 代码相同。
我们所有的开发人员机器都有问题,例如 Mac 笔记本、Windows 笔记本和 Linux 使用 Ubuntu 或 Fedora 的笔记本。
我的环境:
- OS: 5.7.19-2-MANJARO
- Docker:19.03.12-ce,构建 48a66213fe
- CPU:英特尔 i7-1065G7
- 内存:16GB
- 固态硬盘:512 GB PCIe NVMe M.2
如果有人有什么建议,甚至知道如何解决这个问题。
更新:
我将我的本地系统配置为 运行 php-fpm 7.4.10 并在 docker 容器中配置 nginx 以使用我的本地(在主机上)php-fpm。 我没有收到任何错误或“连接被对等方重置”事件。
所以对我来说,docker 和 opcache 似乎是个问题。
有谁知道启用 opcache 时 yii2 在做什么以及如何配置它?
更新: 现在我也有来自 gdb 的分段错误的回溯:
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `php-fpm: pool www '.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 zend_gc_delref (p=0x6341203a79726156) at ./Zend/zend_types.h:1041
1041 ./Zend/zend_types.h: No such file or directory.
(gdb) bt
#0 zend_gc_delref (p=0x6341203a79726156) at ./Zend/zend_types.h:1041
#1 i_zval_ptr_dtor (zval_ptr=<optimized out>) at ./Zend/zend_variables.h:43
#2 zval_ptr_dtor (zval_ptr=<optimized out>) at ./Zend/zend_variables.c:84
#3 0x000055fd4809a88c in user_shutdown_function_dtor (zv=<optimized out>) at ./ext/standard/basic_functions.c:5048
#4 0x000055fd48177a25 in zend_hash_destroy (ht=0x7f961acb1150) at ./Zend/zend_hash.c:1541
#5 0x000055fd480a0515 in php_free_shutdown_functions () at ./ext/standard/basic_functions.c:5174
#6 0x000055fd48106445 in php_request_shutdown (dummy=<optimized out>) at ./main/main.c:1905
#7 0x000055fd47fd14dd in main (argc=<optimized out>, argv=<optimized out>) at ./sapi/fpm/fpm/fpm_main.c:1970
回溯引导我找到解决方案,它是 pcov 模块。
禁用它就成功了。
我被指向 opcache 的分段错误的搜索结果误导了,并且在 PHP 7.4 中对 opcache 进行了更改,并且在使用 PHP 7.3 + opcache 时也启用了 pcov 模块。
现在我很幸运它可以在新的 PHP 版本中再次运行-
因为我们只需要 pcov 来生成代码覆盖率报告,我们可以禁用 opcache 来创建代码覆盖率报告。
如果有人对pcov + opcache + PHP 7.4有更多了解,欢迎留言。