Laradock配置PHP多版本共存

KarlXu 2020-06-06 01:23:29原创浏览量4136

前言:

在实际开发中肯定遇到过项目用不同的laravel版本,服务器也是用不同的php版本

导致本地跑项目的时候会存在php版本不兼容的问题,想着能不能用laradock配置多版本php共存

在网上找了很久没有能直接拿到就用的,不过在其中却得到一些启发

1:进入laradock文件,将php-fpm复制一份为php-fpm56

PS:这里的php-fpm56是指我要装多一个php5.6版本,后续步骤可根据自己所需进行修改

原本我装的是php7.3的版本,这个是在.evn文件中默认的

2:打开laradock目录下的.docker-composer.yml配置文件

复制一份原本的PHP-FPM配置信息修改为自己想要的版本

### PHP-FPM ##############################################
    php-fpm:
      build:
        context: ./php-fpm
        args:
          #省略
      volumes:
        - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini
        - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
        - docker-in-docker:/certs/client
      expose:
        - "9000"
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      environment:
        - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
        - DOCKER_HOST=tcp://docker-in-docker:2376
        - DOCKER_TLS_VERIFY=1
        - DOCKER_TLS_CERTDIR=/certs
        - DOCKER_CERT_PATH=/certs/client
        - FAKETIME=${PHP_FPM_FAKETIME}
      depends_on:
        - workspace
      networks:
        - backend
      links:
        - docker-in-docker


### PHP-FPM56 ##############################################
    php-fpm56:
      build:
        context: ./php-fpm56  #这里也就是第一部复制的文件
        args:
          #省略
          - LARADOCK_PHP_VERSION=5.6  #这里我们手动指定一个版本,不让build的时候读.env默认的版本
      volumes:
        - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini
        - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
        - docker-in-docker:/certs/client
      expose:
        - "9000"
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      environment:
        - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
        - DOCKER_HOST=tcp://docker-in-docker:2376
        - DOCKER_TLS_VERIFY=1
        - DOCKER_TLS_CERTDIR=/certs
        - DOCKER_CERT_PATH=/certs/client
        - FAKETIME=${PHP_FPM_FAKETIME}
      depends_on:
        - workspace
      networks:
        - backend
      links:
        - docker-in-docker

3:重新启动容器,docker会重新build

docker-compose up -d nginx php-fpm56 mysql redis

之前的文章我们知道关联启动的时候会默认帮我们启动php-fpm和workspace容器

这时我们手动再添加一个新增的php-fpm56即可

重新build需要一段时间

4:给不同项目的nginx.conf配置文件指定php版本

a项目的配置文件

server {

    listen 80;
    #listen [::]:80 default_server ipv6only=on;

    # For https
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name testa.cc;
    root /var/www/testa/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream; #这里是默认的
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }
}

b项目的配置文件

server {

    listen 80;
    #listen [::]:80 default_server ipv6only=on;

    # For https
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name testb.cc;
    root /var/www/testb/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-fpm56:9000;  #在这里我们指定使用5.6版本
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }
}

配置完成后重启nginx容器即可

docker-compose restart nginx

5:验证

在2个项目的入口文件打印phpinfo()

TIM图片20200606003054.png

TIM图片20200606003058.png


可以参考之前的文章

1:Win10安装Docker

2:Win10下Docker+Laradock搭建PHP开发环境

3:Laradock配置Nginx多项目


有问题请Email联系: karlxu0424@gmail.com