Centos 安装php Imagick 扩展

2020-01-10 15:57:06

这是最经典的安装方式,参考地址 Centos 安装php Imagick 扩展

如果你的php是通过yum安装的, 请查看全栈网其它文章。

从 centos 仓库安装

首先安装 php-pear php-devel,gcc三个软件包

yum install php-pear php-devel gcc

通过 yum 安装Centos 官方源的 imageMagick 软件

yum install ImageMagick ImageMagick-devel ImageMagick-perl

下一步,验证ImageMagick已经安装在你的系统上并验证它的版本

# convert --versionVersion: ImageMagick 6.7.2-7 2017-03-22 Q16 http://www.imagemagick.orgCopyright: Copyright (C) 1999-2011 ImageMagick Studio LLCFeatures: OpenMP

通过ImageMagick源码安装

未尝试

安装 ImageMagick php扩展

下面通过简单的pecl命令来安装 PHP的 ImageMagick 扩展,它将会安装 ImageMagick 和 一个在/usr/lib/php/modules目录下的一个文件名是imagick.so的ImageMagick php扩展。如果你是使用64位系统,这个扩展放的路径是在/usr/lib64/php/modules

# pecl install imagick WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to updatedownloading imagick-3.4.4.tgz ...Starting to download imagick-3.4.4.tgz (253,434 bytes)
.....................................................done: 253,434 bytes19 source files, buildingrunning: phpizeConfiguring for:PHP Api Version:         20170718Zend Module Api No:      20170718Zend Extension Api No:   320170718Please provide the prefix of ImageMagick installation [autodetect] :

注意:它将会询问你给ImageMagick设置安装的前缀,最简单是按回车键(Enter)让其自动选择

在安装成功之后,会输出类似下面的信息,告诉你imagick.so文件所在的路径

Build process completed successfully
Installing '/usr/lib64/php/modules/imagick.so'
Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'install ok: channel://pecl.php.net/imagick-3.4.4configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini

现在,添加imagick.so 扩展到 /etc/php.ini 文件中

echo extension=imagick.so >> /etc/php.ini

下一步重启 apache 服务器

service httpd restart

你可以运行下面的命令来验证 imagick php扩展.你将会看到一行小的 imagick文字 在下面输出

# php -m | grep imagickimagick

当然,你可以创建一个 php 文件,使用phpinfo()函数输出 php信息。

Laravel项目使用第三方类库来优化图片

图片优化类库是: image-optimizer

安装该类库里面的依赖工具

  1. svgo

npm install -g svgo
  1. jpegoptim

# yum install libjpeg # git clone https://github.com/tjko/jpegoptim.git# cd jpegoptim/# ./configure# make# make install/usr/bin/install -c -d -m 755 /usr/local/share/man/man1
/usr/bin/install -c -d -m 755 /usr/local/bin
/usr/bin/install -c -m 644 jpegoptim.1 /usr/local/share/man/man1/jpegoptim.1
/usr/bin/install -c -m 755 jpegoptim /usr/local/bin/jpegoptim
  1. optipng

点击页面的下载源码包,然后跳到 sourceforge页面下载,等chrome出现下载,进入 chrome的下载管理,复制下载链接

cd /tmp
wget wget https://jaist.dl.sourceforge.net/project/optipng/OptiPNG/optipng-0.7.7/optipng-0.7.7.zipunzip optipng-0.7.7.zip
cd optipng-0.7.7./configuremakemake install
optipng #验证是否运行安装成功
  1. pngquant

首先需要安装 libpng 软件,如果没有安装的话

进入libpng,下载 .tar.gz 格式的文件

和上面一样,当文件在 chrome开始下载的时候,打开chrome的下载内容,复制下载地址

cd /tmp
wget https://nchc.dl.sourceforge.net/project/libpng/libpng16/1.6.37/libpng-1.6.37.tar.gztar -zxvf libpng-1.6.37.tar.gz
cd libpng-1.6.37./configuremakemake install
ldconfig 
pngfix # 验证libpng是否安装成功

然后安装 pngquant

cd /tmp
git clone git://github.com/kornelski/pngquant.gitcd pngquant
./configure
make
make install
pngquant -h  #验证是否安装成功

因为gif扩展不需要使用,所以没有安装

问题

如果运行,出现error while loading shared libraries: libpng16.so.16

pngquant -h

pngquant: error while loading shared libraries: libpng16.so.16: cannot open shared object file: No such file or directory

可以先找以下 libpng16所在的位置

whereis libpng16.so.16libpng16.so: /usr/local/lib/libpng16.so /usr/local/lib/libpng16.so.16

发现编辑的文件不在 /usr/lib,/usr/lib64 2个文件夹下

ls /usr/local/lib #列出该文件夹的文件libpng16.a   libpng16.so     libpng16.so.16.37.0  libpng.la  pkgconfig
libpng16.la  libpng16.so.16  libpng.a             libpng.so

使用ln软链接的方式,将文件放入到放到 /usr/lib,/usr/lib64

ln -s /usr/local/lib/libpng16.so /usr/lib/
ln -s /usr/local/lib/libpng16.so.16 /usr/lib64/

然后在运行pngquant -h 就显示该命令的帮助信息了

error while loading shared libraries libpng16 这里提到的在 make install之后,再运行ldconfig命令,感觉没有效果

图片优化的代码记录

先上传文件,上传完之后,判断文件是否是图片文件,如果是,进行图片优化,控制器ToolsController.php的代码如下

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class ToolsController extends Controller{    private function isImg($fileName)
    { 
         $file  = fopen($fileName, "rb"); 
         $bin  = fread($file, 2); // 只读2字节 
         
         fclose($file); 
         $strInfo = @unpack("C2chars", $bin); 
         $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); 
         $fileType = ''; 
         
         if($typeCode == 255216 /*jpg*/ || $typeCode == 7173 /*gif*/ || $typeCode == 13780 /*png*/) 
         { 
          return $typeCode; 
         }         else
         { 
          return false; 
         } 
    } 

    public function upload(Request $request)
    {        //判断请求中是否包含name=file的上传文件
        if (!$request->hasFile('file')) {            return response()->json(array(                'error_msg' => '请上传文件',                'success' => false,                'data' => array()
            ));
        }        // 判断图片上传中是否出错
        $file = $request->file('file');        if (!$file->isValid()) {            return response()->json(array(                'error_msg' => '上传文件出错,请重试',                'success' => false,                'data' => array()
            ));
        }
        $credentials = $request->all();
        $entension = $file -> getClientOriginalExtension(); //  上传文件后缀
        $filename = uniqid().mt_rand(1,9);  // 重命名图片
        if(!empty($entension)){
            $filename .= '.'.$entension;
        }        if(!isset($credentials['dir'])){
            $credentials['dir'] = 'temp';
        }
        $host = url('/');
        $saveFilename =public_path().'/uploads/'.$credentials['dir'].'/'.$filename ;
        $file->move(public_path().'/uploads/'.$credentials['dir'].'/',$filename);  // 重命名保存
        $img_path = $host.'/uploads/'.$credentials['dir'].'/'.$filename;        try{             //$check = exif_imagetype($saveFilename);
            //$allowedExts = array(IMAGETYPE_JPEG, IMAGETYPE_PNG,IMAGETYPE_WEBP,IMAGETYPE_BMP);

            $isImage = $this->isImg($saveFilename);            //1. 判断文件是否是图片
            if($isImage !== false){
                $factory = new \ImageOptimizer\OptimizerFactory(array(                    'pngquant_options' => ['--force', '--skip-if-larger','--quality 70-80']
                ));
                $optimizer = $factory->get();

                $optimizer->optimize($saveFilename);
            }
        }catch(\Exception $e){
            \Log::error("optimize error".$e->getMessage());
        }       return response()->json(array(            'success' => true,            'error_msg' => '',            'data' => array(                    'url'=>$img_path
            )
       ));
    }
}

备记

本想直接使用php原生的exif_imagetype() 方法进行判断文件是否是图片,但是出现以下错误

exif_imagetype(): Read error!

通过下面命令,都可以当前LAMP环境是有开启对应的扩展的,但是就是读取错误

# php -m |grep exifexif# php -m |grep mbstringmbstring
References
  1. Install ImageMagick (Image Manipulation) Tool on RHEL/CentOS and Fedora 安装的步骤都是按这个博文来的

  2. CentOS 6 系における tmux のインストール 解决error while loading shared libraries: libpng16.so.16的错误

  3. PHP 判断文件是否为图片的方法 判断文件是否是图片


  • 2018-02-17 23:33:20

    NestedScrollView+Recyclerview下滑卡顿解决方法

    大家在进行安卓开发用到NestedScrollView+Recyclerview的时候,经常出现的情况就是加载下滑的时候没有任何问题,很流畅,但是在下滑以后明显出现了卡顿的情况,小编根绝这个问题,给大家再来的解决方法,一起来学习下。

  • 2018-02-23 14:15:42

    mysql的取整函数

    ROUND(X) -- 表示将值 X 四舍五入为整数,无小数位 ROUND(X,D) -- 表示将值 X 四舍五入为小数点后 D 位的数值,D为小数点后小数位数。若要保留 X 值小数点左边的 D 位,可将 D 设为负值。

  • 2018-02-23 14:22:50

    mysql的yearweek 和 weekofyear函数

    例如 2010-3-14 ,礼拜天 SELECT YEARWEEK('2010-3-14') 返回 11 SELECT YEARWEEK('2010-3-14',1) 返回 10 其中第二个参数是 mode ,具体指的意思如下: Mode First day of week Range Week 1 is the first week … 0 Sunday 0-53 with a Sunday in this year 1 Monday 0-53 with more than 3 days this year 2 Sunday 1-53 with a Sunday in this year 3 Monday 1-53 with more than 3 days this year 4 Sunday 0-53 with more than 3 days this year 5 Monday 0-53 with a Monday in this year 6 Sunday 1-53 with more than 3 days this year 7 Monday 1-53 with a Monday in this year 2.

  • 2018-02-23 17:20:44

    Mysql数据库If语句的使用

    MySQL的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用:

  • 2018-02-24 10:16:36

    Java工具类之Apache的Commons Lang和BeanUtils

    Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写。