PHP升级到 PHP 8.0.16 后,设备出现 "Allowed memory size of 134217728 bytes exhausted (tried to allocate 5242880 bytes)" 失败

PHPunit fails with "Allowed memory size of 134217728 bytes exhausted (tried to allocate 5242880 bytes)" after upgrade to PHP 8.0.16

在我的 Laravel 项目中,我升级到当前最新的 Laravel 9.3.0 和 PHP 8.0.16.

原始版本是 Laravel 8.64 和 PHP 7.4。

我 运行 Docker 容器中的项目和 php:8.0.16-fpm-alpine 图像。之前是 php:7.4-fpm-alpine.

这是我在 docker-compose.yml 文件中的 Docker 容器配置:

version: "3"
services:
  php:
    build:
      context: ./.docker-config/dockerfiles
      dockerfile: php.dockerfile
    volumes:
      - ./laravel:/var/www/html:delegated
    networks:
      - mynetwork

这里是 php.dockerfile:

FROM php:8.0.16-fpm-alpine

WORKDIR /var/www/html

RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php

ENV PHP_MEMORY_LIMIT=2G
ENV PHP_UPLOAD_MAX_FILESIZE: 512M
ENV PHP_POST_MAX_SIZE: 512M

RUN docker-php-ext-install pdo pdo_mysql
# ...

如您所见,我为 PHP 内存限制设置了 2 GB

当我 运行 docker-compose run --rm phpunit 我得到这个错误:

PHPUnit 9.5.16 by Sebastian Bergmann and contributors.

...............................................................  63 / 281 ( 22%)
......................
   Symfony\Component\ErrorHandler\Error\FatalError

  Allowed memory size of 134217728 bytes exhausted (tried to allocate 5242880 bytes)

  at database/migrations/2022_01_21_120600_create_tags_table.php:16
     12▕      * @return void
     13▕      */
     14▕     public function up()
     15▕     {
  ➜  16▕         Schema::create('tags', function (Blueprint $table) {
     17▕             $table->id();
     18▕             $table->string('name')->default('');
     19▕             $table->string('type')->default('');
     20▕             $table->string('color', 7)->default('');

这里是引用的迁移文件。我认为,没什么特别的:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('name')->default('');
            $table->string('type')->default('');
            $table->string('color', 7)->default('');
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tags');
    }
};

早些时候在不同的迁移文件上发生了同样的错误。

知道这是怎么回事吗?我该如何解决这个问题?

谢谢!

可以在Dockerfile中使用解决内存限制

RUN echo memory_limit = -1 >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini;

郑重声明,我运行遇到了同样的问题。同样在 Laravel 8->9 升级之后。并且还专门针对各种迁移。

我会继续寻找解决方案,但由于我们在相同的情况下遇到相同的问题,这可能与 Laravel 9 升级有关。

编辑:原来 php8 and/or php 单元有内存泄漏。这给了我真正的问题的原因是我的代码中某处有一个手动内存覆盖:

ini_set('memory_limit', '256M');

删除它后,我的测试 运行 没有问题。当然这不是内存泄漏的解决方案,但至少我的测试能够 运行.

如果您有同样的问题,请检查您的代码是否有类似的错误。