Centos 安装php Imagick 扩展
从 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 --version
Version: ImageMagick 6.7.2-7 2017-03-22 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: 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 update
downloading imagick-3.4.4.tgz ...
Starting to download imagick-3.4.4.tgz (253,434 bytes)
.....................................................done: 253,434 bytes
19 source files, building
running: phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
Please 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.4
configuration 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 imagick
imagick
当然,你可以创建一个 php 文件,使用phpinfo()
函数输出 php信息。
Laravel项目使用第三方类库来优化图片
图片优化类库是: image-optimizer
安装该类库里面的依赖工具
npm install -g svgo
# 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
点击页面的下载源码包,然后跳到 sourceforge页面下载,等chrome出现下载,进入 chrome的下载管理,复制下载链接
cd /tmp
wget wget https://jaist.dl.sourceforge.net/project/optipng/OptiPNG/optipng-0.7.7/optipng-0.7.7.zip
unzip optipng-0.7.7.zip
cd optipng-0.7.7
./configure
make
make install
optipng #验证是否运行安装成功
首先需要安装 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.gz
tar -zxvf libpng-1.6.37.tar.gz
cd libpng-1.6.37
./configure
make
make install
ldconfig
pngfix # 验证libpng是否安装成功
然后安装 pngquant
cd /tmp
git clone git://github.com/kornelski/pngquant.git
cd 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.16
libpng16.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
的代码如下
<?php
namespace 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 exif
exif
# php -m |grep mbstring
mbstring
References
- Install ImageMagick (Image Manipulation) Tool on RHEL/CentOS and Fedora 安装的步骤都是按这个博文来的
- CentOS 6 系における tmux のインストール 解决
error while loading shared libraries: libpng16.so.16
的错误 - PHP 判断文件是否为图片的方法 判断文件是否是图片
Centos 安装php Imagick 扩展的更多相关文章
- Linux下安装 php imagick扩展
今天小编 由于工作需求用到了 imagick 这个扩展 服务器环境是 lnmp 架构下面稍微来介绍下 这个 东东 imagick是一个PHP的扩展,用ImageMagick提供的API来进行图片的创 ...
- CentOS安装php及其扩展
列出所有的可安装的软件包 yum list | grep php56w* | grep redis 安装php及其扩展 yum install -y php56w php56w-mysql php5 ...
- centos 安装php7 memcached扩展
在使用下面这种方式安装php7 memcached扩展时,先要安装好memcached服务器yum -y install php70w-pecl-memcached
- CentOS 安装 MySQL PDO 扩展
yum install php-pdo_mysql sudo service php-fpm restart
- Centos 安装ImageMagick 与 imagick for php步骤详解
现在有很多朋友在使用安装ImageMagick imagick for php了,今天自己也想做但是不知道如何操作,下面我来给大家介绍Centos 安装ImageMagick imagick for ...
- wamp环境下安装imagick扩展
先上图,如下是安装成功后的phpinfo()界面: 安装步骤: 1.先确定安装版本,比如我的的php : php7.0.12 x86 ts 那么就需要三方版本 要一致:imagick软件本身( 如x ...
- 转 ImageMagick及PHP的imagick扩展的安装及配置
imagick是一个PHP的扩展,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的API Image ...
- Linux安装imagick扩展出现错误:configure: error: not found. Please provide a path to MagickWand-config or Wand-config program.
在Linux(CentOS)上安装imagick扩展时,遇到如下错误: checking ImageMagick MagickWand API configuration program... che ...
- 安装ImageMagick7.1库以及php的Imagick扩展
由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,并写此文章记录一下. 如果安装过程中遇到一些未知的错误,https://ima ...
随机推荐
- 博客中引入了gitment评论系统
官方github地址:https://github.com/imsun/gitment 官方中文说明地址:https://imsun.net/posts/gitment-introduction/ 官 ...
- 笔记61 Spring Boot快速入门(一)
IDEA+Spring Boot快速搭建 一.IDEA创建项目 略 项目创建成功后在resources包下,属性文件application.properties中,把数据库连接属性加上,同时可以设置服 ...
- Linux防火墙设置——iptables
防火墙用于监控往来流量,并根据用户定义的规则来过滤数据包以保证安全.iptables是Linux下设置防火墙规则的常用工具,它可以让你设置.维护以及查看防火墙的规则表.你可以定义多个表,每个表可以包含 ...
- 批量修改root密码
公司有五十多台服务器.每台服务器中使用的密码完全不同,同时操作系统也不一样,centos5,6,7 .ubuntu,windows都有,更不用提其中各种小版本. root密码定期更改是一个大问题(wi ...
- ansible如何用root用户运行普通用户授权
ansible默认以root用户进行授权,但是需要用普通用户执行一些命令操作: 如: 1. ansible 10.0.0.1 -m raw -a "date" -u www 但是会 ...
- PHP ftp_get_option() 函数
定义和用法 The ftp_get_option() 函数返回 FTP 连接的各种运行时选项. 语法 ftp_get_option(ftp_connection,option) 参数 描述 ftp_c ...
- linux IPC socket
套接字是通讯端点的抽象 创建一个套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain ...
- BZOJ 2005: [Noi2010]能量采集(容斥+数论)
传送门 解题思路 首先题目要求的其实就是\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m [(gcd(i,j)-1)*2+1)]\),然后变形可得\(-n*m+2\s ...
- NOIp2018集训test-10-19 (bike day5)
Bike老爷问了好几天到底要怎样简单的题目你们才能AK啊终于在他每天降难度直到要走了才出了一套我们能AK的题.虽然前几天的题换成llj肯定随便AK. 其实最近有点方虽然通常最后都写完了把该拿的分拿了该 ...
- Arduino与NodeMCU——联网
我们现在要使用Arduino IDE来配置您的ESP8266芯片.这是使用该芯片的好方法,因为您可以使用着名的Arduino IDE对其进行编程,并重复使用几个现有的Arduino库.如果尚未完成,请 ...