调用未定义函数 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()"的主要内容,如果未能解决你的问题,请参考以下文章