TypechoJoeTheme

OrzLee logo

orzlee

世界上只有一个问题,那就是时间问题
网站页面

laradock-xdebug与php版本不兼容

2020-12-18
/
0 评论
/
61 阅读
/
正在检测是否收录...
12/18

前言

今天掉坑里了,为了添加grpc-php扩展,重新build php-fpm和workspace。过程相当顺利,而且启动docker都没问题,开发过程也没发现(api 调式和开发)。知道访问laravel-admin后台页面,访问半天打不开。HTTP 502错误。

摸索过程

出现502错误开始没在意,以为是早上composer update,太慢直接手动中断了,可能缓存什么的出问题了。

刚开始没在意,直到我尝试php artisan ide-helper:genide-helper开发工具)时出错了 segmentation fault php artisan ide-helper:gen。 这下真有问题了。

尝试访问其他开发站点,登录页没有问题,laravel日志也没有。 查看docker日志

docker-compose logs php-fpm

出现大量日志 看到这行感觉莫名其妙: Illuminate\Contracts\Container\BindingResolutionException: Target [Closure] is not instantiable while building [Encore\Admin\Layout\Content]. in /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php on line

不可能会出现这种错误啊,查看源码:

namespace Encore\Admin\Layout;

use ...

class Content implements Renderable
{
...
    /**
     * Content constructor.
     *
     * @param Closure|null $callback
     */
    public function __construct(\Closure $callback = null)
    {
        if ($callback instanceof Closure) {
            $callback($this);
        }
    }
}

构造函数有默认值,而且参数也是个闭包,不可能出现字符串Closure被容器实例化啊。简直一脸懵逼...

想断点调试代码,xdebug也失效了。开始用gdb调试过,发现大量xdebug关键字,想着八成与它脱不了干系。

laradock看源码,对比本地php-fmp和workspace的Dockerfile文件,虽然没有新版本发布,但是这两文件确实有改动xdebug部分。

  • php-fpm

      ###########################################################################
      # xDebug:
      ###########################################################################
    
      ARG INSTALL_XDEBUG=false
    
      RUN if [ ${INSTALL_XDEBUG} = true ]; then \
        # Install the xdebug extension
        if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \
          pecl install xdebug-2.5.5; \
        else \
          if [ $(php -r "echo PHP_MINOR_VERSION;") = "0" ]; then \
            pecl install xdebug-2.9.0; \
          else \
            pecl install xdebug-2.9.8; \
          fi \
        fi && \
        docker-php-ext-enable xdebug \
      ;fi
    
      # Copy xdebug configuration for remote debugging
      COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
    
      RUN sed -i "s/xdebug.remote_autostart=0/xdebug.remote_autostart=1/" /usr/local/etc/php/conf.d/xdebug.ini && \
          sed -i "s/xdebug.remote_enable=0/xdebug.remote_enable=1/" /usr/local/etc/php/conf.d/xdebug.ini && \
          sed -i "s/xdebug.cli_color=0/xdebug.cli_color=1/" /usr/local/etc/php/conf.d/xdebug.ini
  • workspace

      ###########################################################################
      # xDebug:
      ###########################################################################
    
      USER root
    
      ARG INSTALL_XDEBUG=false
    
      RUN if [ ${INSTALL_XDEBUG} = true ]; then \
        # Install the xdebug extension
        if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \
          pecl install xdebug-2.5.5; \
        else \
          if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ] && [ $(php -r "echo PHP_MINOR_VERSION;") = "0" ]; then \
            pecl install xdebug-2.9.0; \
          else \
            if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ] && [ $(php -r "echo PHP_MINOR_VERSION;") = "1" ]; then \
              pecl install xdebug-2.9.8; \
            else \
              if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \
                pecl install xdebug-2.9.8; \
              else \
                #pecl install xdebug; \
                echo "xDebug 3 required, not supported."; \
              fi \
            fi \
          fi \
        fi && \
        echo "zend_extension=xdebug.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/20-xdebug.ini \
      ;fi
    
      # ADD for REMOTE debugging
      COPY ./xdebug.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini
    
      RUN sed -i "s/xdebug.remote_autostart=0/xdebug.remote_autostart=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini && \
          sed -i "s/xdebug.remote_enable=0/xdebug.remote_enable=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini && \
          sed -i "s/xdebug.cli_color=0/xdebug.cli_color=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini

    xdebug版本被限制在2.9.8,我去xdebug官网查看发现最新3.0.1,立马去workspace执行php -v:

    PHP 7.4.13 (cli) (built: Nov 28 2020 06:24:43) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
      with Zend OPcache v7.4.13, Copyright (c), by Zend Technologies
      with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

    果然是最新版本,这是laradock问题,将php-fpm和workspace Dockerfile xdebug代码段替换再 build 就能解决了。

结语

xdebug 3.x估计是对应php8,目前开发环境使用PHP7,出现这种莫名其妙的错误真的很难调试。浪费大半天时间,重新build不知道多少遍,总之记住扩展不兼容也会出现各种莫名其妙问题。

laradockxdebug
朗读
赞 · 0
版权属于:

OrzLee

本文链接:

https://www.orzlee.com/toss/2020/12/18/laradockxdebug-is-not-compatible-with-php-version.html(转载时请注明本文出处及文章链接)

评论 (0)