调用未定义函数 Intervention\Image\Gd\imagejpeg()"

Posted

技术标签:

【中文标题】调用未定义函数 Intervention\\Image\\Gd\\imagejpeg()"【英文标题】:Call to undefined function Intervention\Image\Gd\imagejpeg()"调用未定义函数 Intervention\Image\Gd\imagejpeg()" 【发布时间】:2020-12-03 22:06:30 【问题描述】:

我正在将 Laravel 与 docker php:7.3-fpm 图像一起使用。

当我像这样使用Image Intervention Package 时遇到问题Call to undefined function Intervention\Image\Gd\imagejpeg()"

$avatar = \Image::make($image->getRealPath());
$avatar->fit(221, 146)->encode('jpg', 80);

这是完整的错误信息:

exception: Symfony\Component\Debug\Exception\FatalThrowableError^ #8221
      -originalClassName: "Error"
      #message: "Call to undefined function Intervention\Image\Gd\imagejpeg()"
      #code: 0
      #file: "/var/www/vendor/intervention/image/src/Intervention/Image/Gd/Encoder.php"
      #line: 17
      #severity: E_ERROR
      trace: 
        /var/www/vendor/intervention/image/src/Intervention/Image/Gd/Encoder.php:17  …
        /var/www/vendor/intervention/image/src/Intervention/Image/AbstractEncoder.php:123  …
        /var/www/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php:79  …
        /var/www/vendor/intervention/image/src/Intervention/Image/Image.php:121  …
        /var/www/app/Repositories/MediaRepository.php:37 
          App\Repositories\MediaRepository->addGalleryToTraining(array $images): void^
          › 
          › $avatar->fit(221, 146)->encode('jpg', 80);
          › $avatar_path  = 'trainings/gallery/' . $gallery->id . '/avatars/' . $image->hashName();
          arguments: 
            $format: "jpg"
            $quality: 80
          
        

Gd/Encoder.php 的第 17 行是这样的:

imagejpeg($this->image->getCore(), null, $this->quality);

我发现here 我应该安装支持 jpg / png 的 GD。但是,there 的答案是针对 php:7.2-fpm-alpine 图像的。由于我不使用图像,因此无法将其应用于apk add libjpg .. 解决方案。

我还发现here 使用PHP:7.2-fpm 图像并声称可以修复jpg 问题。

我用过

RUN apt-get install -y build-essential libssl-dev zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev

RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd

来自该解决方案,但我仍然收到上述错误。这是我完整的 Dockerfile:

FROM php:7.3-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    git \
    curl \
    libssl-dev \
    zlib1g-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libonig-dev \
    libxml2-dev \
    libicu-dev \
    zip \
    unzip \
    libzip-dev \
    -y mariadb-client

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install zip mysqli soap pdo_mysql mbstring exif pcntl bcmath gd  && docker-php-ext-enable mysqli && docker-php-ext-configure intl \
    && docker-php-ext-install \
        intl \
    && docker-php-ext-enable intl

RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    --with-gd \
    --with-jpeg-dir \
    --with-png-dir \
    --with-zlib-dir

RUN apt update && apt install -y libc-client-dev libkrb5-dev && rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && docker-php-ext-install imap

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user

知道是什么原因造成的吗?

【问题讨论】:

php -m 告诉你什么?模块是否安装?如果您依赖打包的扩展,则不需要安装所有这些开发库,只需 apt-get install php7.2-gd @miken32 gd 列在包中。我也通过RUN docker-php-ext-install ... gd ... 安装了它。我仍然收到Call to undefined function Intervention\Image\Gd\imagejpeg()" 请把你的代码块发给我们。 imagejpeg() 是全局的,不是命名空间的,所以它可能是代码中的问题。 @ŁukaszJakubek 我添加了代码部分,尽管归结为使用imagejpeg @ŁukaszJakubek 同样,此代码在使用 Homestead 和 Vagrant 时有效 - 因为我试图切换到 docker,所以它只是失败了。 【参考方案1】:

缺少这一行:

RUN docker-php-ext-install -j$(nproc) gd

所以我最终的 dockerfile 看起来像这样:

FROM php:7.3-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    git \
    curl \
    libssl-dev \
    zlib1g-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libonig-dev \
    libxml2-dev \
    libicu-dev \
    zip \
    unzip \
    libzip-dev \
    -y mariadb-client

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install zip mysqli soap pdo_mysql mbstring exif pcntl bcmath gd  && docker-php-ext-enable mysqli && docker-php-ext-configure intl \
    && docker-php-ext-install \
        intl \
    && docker-php-ext-enable intl


RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    --with-gd \
    --with-jpeg-dir \
    --with-png-dir \
    --with-zlib-dir

RUN docker-php-ext-install -j$(nproc) gd

RUN apt update && apt install -y libc-client-dev libkrb5-dev && rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && docker-php-ext-install imap

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user

在Troubles with Docker + PHP7 + GD resulting in "Call to undefined function imagecreatefromjpeg()"找到那条丢失的行

【讨论】:

以上是关于调用未定义函数 Intervention\Image\Gd\imagejpeg()"的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义函数 Mpdf\\Mpdf()

辅助函数未加载 laravel 5 - 调用未定义函数

如果子类未定义构造函数,是不是会调用父构造函数?

Codeigniter:调用未定义的函数(模型)

调用类方法时出现“调用未定义函数”错误

phpMyAdmin 错误调用未定义函数