Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Yii2应用程序在升级到php 7.4并激活opcache后导致对等方重置连接_Docker_Nginx_Yii2_Opcache_Php 7.4 - Fatal编程技术网

Docker Yii2应用程序在升级到php 7.4并激活opcache后导致对等方重置连接

Docker Yii2应用程序在升级到php 7.4并激活opcache后导致对等方重置连接,docker,nginx,yii2,opcache,php-7.4,Docker,Nginx,Yii2,Opcache,Php 7.4,我们有一个大型的yii2应用程序,它在启用了nginx+PHP-fpm7.3和opcache的Debian Docker容器中完美运行 升级到PHP7.4.10后,在从上游读取响应头时,一些请求会导致“(由对等方重置连接)错误。 禁用opcache可以解决问题,但这并不是一个真正的选项。我也可以启用opcache并将整个yii2供应商文件夹列入黑名单,但这也不是一个选项 我们还在Debian VM上安装了一个非docker PHP-FPM 7.4+nginx+opcache,该seam到目前为止

我们有一个大型的yii2应用程序,它在启用了nginx+PHP-fpm7.3和opcache的Debian Docker容器中完美运行

升级到PHP7.4.10后,在从上游读取响应头时,一些请求会导致“(由对等方重置连接)错误。 禁用opcache可以解决问题,但这并不是一个真正的选项。我也可以启用opcache并将整个yii2供应商文件夹列入黑名单,但这也不是一个选项

我们还在Debian VM上安装了一个非docker PHP-FPM 7.4+nginx+opcache,该seam到目前为止运行时不会出现此类错误。但我们需要Docker环境进行开发,然后在生产中切换到Docker环境

使用PHP7.3+opcache运行测试大约需要12分钟,现在没有opcache需要30分钟(!)

我尝试过,但没有成功:

  • 使用官方的Yii2 docker图像
  • 使用官方的PHP7.4.10Apache映像
  • 使用官方PHP-FPM 7.4.10和最新的Nginx映像
  • 使用比“docker version 19.03.12-ce,build 48a66213fe”更低版本的docker
  • 在nginx、opcache和php的不同变体中设置几个参数,我在网络中发现类似于忽略nginx的无效头
  • 将PHP版本降级到7.4.9或7.4.2
  • 试图在我们的代码库中查找并修复导致错误的代码,但在大多数情况下,仅结果内容发生了更改,这意味着相同的控制器操作运行时会出现错误,而只有内容发生了更改。头和HTTP返回代码是相同的
我们所有的开发人员机器都有这个问题,比如使用Ubuntu或Fedora的Mac笔记本、Windows笔记本和Linux笔记本

我的环境:

  • OS:5.7.19-2-MANJARO
  • 码头工人:19.03.12-ce,建造48a66213fe
  • CPU:英特尔i7-1065G7
  • 内存:16 GB
  • SSD:512 GB PCIe NVMe M.2
如果有人有一些建议,甚至知道如何解决这个问题

更新:

我将本地系统配置为运行php fpm 7.4.10,并将docker容器中的nginx配置为使用本地(主机上)php fpm。 我没有收到任何错误或“由对等方重置连接”事件

所以对我来说,docker和opcache可能有问题

有人知道启用opcache时Yi2在做什么,以及如何配置它吗

更新: 现在我还从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
使用主机libthread_db library”/lib/x86_64-linux-gnu/libthread_db.so.1”。
核心是由“php fpm:pool www”生成的。
程序以信号SIGSEGV终止,分段故障。
#0 zend_gc_delref(p=0x6341203a79726156)位于/zend/zend_类型。h:1041
1041./Zend/Zend_types.h:没有这样的文件或目录。
(gdb)英国电信
#0 zend_gc_delref(p=0x6341203a79726156)位于/zend/zend_类型。h:1041
#1 i_zval_ptr_dtor(zval_ptr=)位于/Zend/Zend_变量。h:43
#2 zval_ptr_dtor(zval_ptr=)位于./Zend/Zend_变量。c:84
#在./ext/standard/basic_functions.c:5048处的用户_shutdown_函数_dtor(zv=)中3 0x000055fd4809a88c
#4 0x000055fd48177a25位于/zend/zend_hash.c:1541的zend_hash_destroy(ht=0x7f961acb1150)中
#5 0x000055fd480a0515在./ext/standard/basic_functions.c:5174的php_free_shutdown_函数()中
#6 0x000055fd48106445位于./main/main.c:1905的php_请求_关闭(虚拟=)中
#7 0x000055fd47fd14dd位于/sapi/fpm/fpm/fpm_main.c:1970处的main(argc=,argv=)中

回溯引导我找到解决方案,它是pcov模块

禁用它成功了

当使用PHP7.3+opcache时,我被指向opcache的分段错误的搜索结果误导,以及对PHP7.4中的opcache和pcov模块所做的更改

现在,我很幸运它能在新的PHP版本中再次工作-

因为我们只需要pcov来生成代码覆盖率报告,我们可以禁用opcache来创建代码覆盖率报告

如果有人知道更多关于pcov+opcache+php7.4的信息,请留下评论