Laravel 5.2:未找到Imagick类

11
我们正在将PDF页面转换为多个单张图片。我们在stackoverflow上找到了一段代码片段并将其转换为服务类。我们已经安装了Imagick,并且它也显示在phpinfo()中。但是,在我们的laravel应用程序版本5.2中,我们遇到了以下错误。
ReflectionException in Container.php line 798:
Class Imagick does not exist

我们在Laravel环境之外测试了我们的代码,它运行得像魅力一样。没有抛出任何错误。我们还运行以下命令来检查Imagick。

php -i | grep -i imagick

这是输出结果

    /etc/php5/cli/conf.d/20-imagick.ini,
    imagick
    imagick module => enabled
    imagick module version => 3.4.3RC1
    imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator
    Imagick compiled with ImageMagick version => ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
    Imagick using ImageMagick library version => ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
    imagick.locale_fix => 0 => 0
    imagick.progress_monitor => 0 => 0
    imagick.skip_version_check => 0 => 0

一切似乎都正确。它在 Laravel 之外能够工作,但在 Laravel 中却不能。我不知道出了什么问题。我们是否需要配置 Laravel 来使用 Imagick?

这是我们正在使用的服务类。

<?php

namespace App\Services\Utilities;

use Imagick;

class PdfToImageService
{
    /**
     * Destination folder where images will be saved
     * @var string
     */
    protected $destination = 'images/users/';

    /**
     * Injecting dependencies
     * 
     * @param Imagick $imagick
     */
    function __construct(Imagic $imagick)
    {
        $this->imagick = $imagick;
    }

    /**
     * Convert pdf having multiple pages to multiple single images
     * 
     * 1. Strip document extension
     * 2. Convert this document
     * 3. Set background color and flatten. It Prevents black background on objects with transparency
     * 4. Set image resolution
     * 5. Determine number of pages
     * 6. Compress Image Quality
     * 7. Generate images from each pdf page
     * 8. Destroy current imagick session
     * 
     * @param  string $fileName
     * @return array  $convertedImageNames
     */
    public function createImages($fileName)
    {
        $fileName = basename($fileName);
        $this->imagick->readImage($fileName);
        $this->imagick->setImageBackgroundColor('white');
        $this->imagick->setResolution(300,300);
        $this->imagick->setImageCompressionQuality(100);

        $convertedImageNames = $this->generateImageFromPDFPage(
            $fileName, $this->imagick->getNumberImages()
        );

        $this->imagick->destroy();

        return $convertedImageNames;
    }

    /**
     * Loop throught each pdf pages and convert it to image.
     *      A. Set iterator postion
     *      B. Set image format
     *      C. Write Images to destination folder 
     * 
     * @param  string  $fileName
     * @param  integer $noOfPages
     * @return array
     */
    private function generateImageFromPDFPage($fileName, $noOfPages)
    {
        for($i = 0;$i < $noOfPages; $i++) {
            $this->imagick->setIteratorIndex($i);
            $this->imagick->setImageFormat('jpeg');    
            $this->imagick->writeImage($this->destination.$fileName.'-'.$i.'.jpg');
            $convertedImageNames[$i] = $fileName.'-'.$i.'.jpg';
        }

        return $convertedImageNames;
    }
}

问题可能出在命名空间上。尝试在 Imagick 的 use 语句前面添加 \。这可能是 Laravel 在 IOC 容器中解析错误的类,它可能无法理解全局命名空间中的类。 - developernaren
1
你尝试安装过ImageMagick吗? apt-get install imagemagick - rüff0
1
function __construct(Imagic $imagick) - 这看起来不像是你尝试加载正确的类。你尝试使用 Imagick 而不是 Imagic 了吗? - Nico Haase
4个回答

4

这是我在Homestead上使用Laravel 5.7的解决方案:

sudo apt-get update
sudo apt-get install -y imagemagick php-imagick
sudo service php7.2-fpm restart
sudo service nginx restart

如果您使用的 PHP 版本不是 7.2 或者未使用 Nginx,您需要进行调整。


软件包 'php-imagick' 没有安装候选项。 - Abdennour TOUMI
然而,我在这里找到了答案:https://github.com/docker-library/php/issues/105#issuecomment-421081065 - Abdennour TOUMI

2

如果您的Linux系统是Ubuntu,您可以尝试编辑位于cd /etc/php5/apache2/php.ini的php.ini文件。请注意,不要删除任何HTML标签。

cat php.ini | grep extension=imagick.so

如果有搜索结果,你可能会得到这个;extension=imagick.so。你需要删除这个分号;如果没有任何结果,

echo "extension=imagick.so" >> /etc/php5/apache2/php.ini

最后,
sudo /etc/init.d/apahce2 restart

这段代码可以正常运行

<?php

namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use Imagick;

class GuestController extends BaseController {

    public $imagic;

    public function __construct(){
        $this->imagic = new Imagick();
    }

    public function test(){
        return get_class_methods($this->imagic);
    }
}

我们已经完成了这个步骤,在 /etc/php5/apache2/php.ini 中添加了 extension=imagick.so 并重新启动了 Apache 服务器。我们已经完成了所有必要的设置。我猜测问题出在我的笔记本电脑上。现在它已经正常工作了。我应该在之前重启我的笔记本电脑。无论如何,感谢您的回复。 - IamGhale

0

尝试这个:

  1. 在此处下载扩展(tarball): http://pecl.php.net/package/imagick

(假设您使用的版本为:3.4.3)

  • 使用终端进入扩展目录 例如

    cd /Downloads/
    
  • 解压tarball文件

    tar xf imagick-3.4.3.tgz
    
  • 进入新提取的目录

    cd imagick-3.4.3.tgz
    
  • 对库进行phpize操作(基于C语言编写)

    phpize
    
  • 运行

    ./configure
    
  • 运行

    make && make test && make install
    
  • 进入您的php.ini文件(通常在Ubuntu中位于/etc/php/7.x/cli/php.ini),并添加以下行:

    extension=imagick.so 
    
  • 就这样。更新PHP

        service php7.2-fpm restart
    

    还有服务器(apache,nginx或其他)。


    我遇到了这个错误:"检查ImageMagick MagickWand API配置程序... 检查测试/usr/local/bin/MagickWand-config...不存在"。 - Ryan
    尝试使用phpinfo()函数检查扩展是否为php。http://php.net/manual/en/function.phpinfo.php - Luigi Lopez
    1
    ./configure 这部分。不过这个对我有用:https://dev59.com/IVoU5IYBdhLWcg3wG0Ky#52742469 - Ryan

    -1

    安装Imagick,请运行以下命令:
    sudo apt-get install php-imagick

    对于特定的PHP版本(在我的情况下是7.1):
    sudo apt-get install php7.1-imagick

    然后重新启动Apache:
    sudo service apache2 restart

    要检查扩展是否已安装:
    php -m | grep imagick

    如果上述方法不适用于您,请尝试以下方法:
    sudo apt install libmagickwand-dev
    sudo apt-get install php-imagick

    使用extension=imagick.so更新php.ini,然后重新启动Apache。


    请在您的答案中添加一些解释,以便其他人可以从中学习。根据 php -i 的输出,这些软件包已经安装。 - Nico Haase

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接