在PHP8 RC,Composer2,Xdebug3 RC上运行Laravel 8.x

 2021-01-21 

概述

  • 由于PHP8.0是RC,所以我将尝试使用各种新环境来构建环境。
  • 环境本身将使用Docker构建
  • 我认为它不能在所有环境中使用,但我希望它会有所帮助。
  • 由于PHP8.0和Xdebug3都是RC,因此有必要对其进行开发研究,以便目前不会将其投入实际使用。

最终环境

1
2
3
4
5
6
7
8
9
$ docker-compose exec app php --version
PHP 8.0.0RC4 (cli) (built: Nov 12 2020 20:17:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0RC4, Copyright (c), by Zend Technologies
    with Xdebug v3.0.0RC1, Copyright (c) 2002-2020, by Derick Rethans

$ docker-compose exec app composer --version
Composer version 2.0.7 2020-11-13 17:31:06

可交付成果

它在GitHub上列出,因此请参考。
Dockerfile的最终状态也在存储库

中列出

https://github.com/hrs-o/PHP8.0RC-Laravel

PHP7.4时代的Dockerfile

  • 主要目的是为8.0RC重写这个7.4时代的Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FROM php:7.4-fpm-alpine

RUN apk upgrade --update && \
    apk --no-cache add autoconf build-base git libxml2-dev libzip-dev oniguruma-dev openssh rsync

RUN docker-php-ext-install -j$(nproc) zip pdo_mysql mysqli
RUN docker-php-ext-install -j$(nproc) bcmath fileinfo ctype json mbstring tokenizer xml
RUN docker-php-ext-install -j$(nproc) opcache

RUN pecl install apcu \
    && docker-php-ext-enable apcu

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

RUN pecl install redis  \
    && docker-php-ext-enable redis

RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && composer self-update

RUN composer global require hirak/prestissimo
RUN composer global require squizlabs/php_codesniffer
RUN composer global require friendsofphp/php-cs-fixer
RUN composer global require phpmd/phpmd
RUN chmod 777 /var/log/

ENV PATH "/root/.composer/vendor/bin:$PATH"

尝试

将图像更改为8.0-rc-fpm-alpine

当然,它不会通过构建

  • 苔藓与RUN docker-php-ext-install -j$(nproc) json

    • 无需指定即可使用,因此我简单地省略了它。
    • https://wiki.php.net/rfc/always_enable_json
  • 似乎pecl当前已从PHP映像中省略,因此无法使用

    • https://externals.io/message/103977
    • 看来是从PHP7.4起的,但是我曾经在PHP7.4中经历过pecl ...?
    • 因此,请考虑使用FriendsOfPHP / pickle而不是pecl。

使用FriendsOfPHP / pickle

  • 如果是从发行版本中获得的咸菜,则无法很好地获得Xdebug-beta的VERSION,并且会发生错误。
  • 您说过应该建立桅杆,但是不能使用它,因为xdebug的beta版本会导致解析错误。
  • 因此,我决定在自己的存储库中以修改后的状态分叉并使用它(PR本身已经发送,希望它会被接受)

    • 当前,pickle只能与composer1一起使用,因此请使用Composer 1的映像进行构建,然后将其复制到PHP 8.0。
  • 通过将与pecl一起安装的部分更改为pickle,我能够安装apcu,xdebug-beta和redis。
1
2
3
4
5
6
7
8
9
10
11
12
FROM composer:1 as pickle

RUN cd /tmp \
    && git clone https://github.com/hrs-o/pickle.git \
    && cd pickle \
    && git checkout update/dumper-stability \
    && composer install --no-dev --optimize-autoloader \
    && php -d phar.readonly=0 box.phar build

FROM php:8.0-rc-fpm-alpine

COPY --from=pickle /tmp/pickle/pickle.phar /usr/local/bin/pickle

无法安装hirak / prestissimo

  • 似乎hirak / prestissimo当前与Composer 2不兼容,因此我放弃了一次。

    • 实际上,Composer 2速度很快,因此您不必使用prestissimo!存储库中有描述。

到目前为止,使用

可以完成对Dockerfile的修改,因此我将安装Laravel并检查操作。

Laravel安装

1
2
$ mkdir src
$ docker-compose exec app composer create-project --prefer-dist laravel/laravel . "8.*"

.env设置

我将尝试连接到DB和Redis,因此将其设置为

.env

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~~
DB_CONNECTION=mysql
DB_HOST=php8-mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

~~

REDIS_HOST=php8-redis
REDIS_PASSWORD=null
REDIS_PORT=6379

~~

迁移执行

1
$ docker-compose exec app php artisan migrate

定义并执行View?Controller?Roter

请参阅提交内容
https://github.com/hrs-o/PHP8.0RC-Laravel/commit/69e1aae936ff77b6c165c68f5f39576301c697f8

目前,数据库连接和与Redis的连接似乎运行良好

检查是否可以从IDE

进行远程调试

这次,我们的目标是IntelliJ Idea(PHPStorm)

已修复,因为Xdebug的设置已更改

https://3.xdebug.org/docs/upgrade_guide

php.ini

1
2
3
4
5
6
7
8
9
10
11
12
[xdebug]
- xdebug.remote_enable = 1
+ xdebug.mode = debug
- xdebug.remote_autostart = 1
+ xdebug.start_with_request = yes
- xdebug.remote_host = host.docker.internal
+ xdebug.client_host = host.docker.internal
- xdebug.remote_port = 9000
+ xdebug.client_port = 9003
- xdebug.remote_log = /tmp/xdebug.log
+ xdebug.log = /tmp/xdebug.log
xdebug.idekey = PHP8

XDEBUG端口设置

  • 语言能力