php 安装imagic扩展及服务

https://www.cnblogs.com/jinxiblog/p/8053008.html

最近的PHP项目中,需要用到切图和缩图的效果,在本地windows开发环境,安装过程遇到好多问题,在此与大家分享。

php官网里,一大群老外也看不懂这玩意怎么装,主要原因在于,php版本庞杂,还有x86 x64 nts ts,对应的imagick版本也不一定相同,imagick第一道关还算容易,总还是有办法装上,imagick对应的ImageMagick程序又不一定了,又出现庞杂的版本,即使官网给出的依赖版本也没有效果,同时也没有官方任何地方给出一个合理的安装方法,真是变态。从中文到英文,从php文档到百度、谷歌资料,各种版本,全是坑!

使用环境

 

安装步骤

根据环境下载合适的 imagick扩展 和 imagemagick程序

1.下载拓展

下载地址一: http://windows.php.net/downloads/pecl/releases/imagick/
下载地址二: https://pecl.php.net/package/imagick
要点: 注意对应php版本 ts还是nts x86还是x64
这里以phpinfo()为准

所以我应该下载imagick 3.4.3版本 PHP5.6  Non Thread Safe (NTS) x86 的拓展——php_imagick-3.4.3-5.6-nts-vc11-x86.zip

2. 安装拓展

  1. 解压上述文件后,将php_imagick.dll复制到php/ext目录,或者其他你的存放拓展的目录
  2. 修改php.ini 加上extension=php_imagick.dll,注意php可能有多个ini,以phpinfo为准
  3. 此时复制解压上述文件目录中其他dll到php目录,重启apache,此时phpinfo显示拓展安装成功,但是 ImageMagick number of supported formats为0,到这里成功安装了一半

注意,如果安装后还是找不到imagic扩展或者phpinfo()中不显示的话:

来源:https://newsn.net/say/php-imagick.html

启后,刷新phpinfo()页面,发现:没有效果,加载失败!那么,究竟是为什么呢?

如果没有显示相关扩展信息,在运行imagemagick相关代码的时候,就可能会碰到下面的错误信息输出:

Fatal error: Uncaught Error: Class 'Imagick' not found

特别配置【不同于其他扩展】

php-imagick扩展压缩包中,除了php_imagick.dll外,还有其它一堆.dll文件。【重点来了】,这些文件要放置在特殊位置,这个php_imagick.dll才能最终加载成功。经过无数次实验,这个可以生效的位置是:

  • php根目录下面,也就是php.exe的同级目录下面。【推荐】
  • 系统目录,比如system32目录下面。
  • 系统环境变量path下的自定义目录下面,注意一定需要【系统环境变量】,而不是用户环境变量。而且环境变量的生效,是需要读取和刷新的时机的,所以出错的概率比较大。

刷新phpinfo()页面,就可以显示该扩展加载成功!

苏南大叔:windows环境,php如何正确安装并配置imagick扩展? - phpinfo-imagick

3 下载imagemagick程序

下载地址:http://windows.php.net/downloads/pecl/deps/
imagemagick还有官网下载,此处不鼓励从imagemagick官方下载,他们的网站上我并没有找到历史版本下载,安装失败的几率很大
下载与phpinfo提示一致的版本,此时需要注意  1.软件版本对应     2.vc11还是vc14 3.x86还是x64 都要以phpinfo为准,我的

所以我下载 ImageMagick-6.9.3-7

4 安装imagemagick程序

  1. 下载的文件解压后,将程序整体复制到无空格 无中文字符的目录中 E:\Program Files (x86)\
  2. 配置环境变量,在“此电脑”右键“属性”,以此点击“高级” “环境变量” ,在 “系统变量”中找到键为path的数据,双击path,选择“新建”,将刚刚放程序的目录“E:\Program Files (x86)\ImageMagick\bin”填入即可
  3. 将“E:\Program Files (x86)\ImageMagick\bin”目录中的所有的以“.DLL‘为后缀的文件放入php的根目录,应该有145个

 

重启计算机

 

错误信息1:

 FailedToExecuteCommand `"gs" -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" -dPrinted=false  "-sOutputFile=C:/Users/84660/AppData/Local/Temp/magick-Ur8OfJdJ8WzKRKRp1M3pYsWnK1tB2l5E%d" "-fC:/Users/84660/AppData/Local/Temp/magick-_EVrlnoxRn8PG1KhwRJpXlx5LH75faSf" "-fC:/Users/84660/AppData/Local/Temp/magick-um7P_A9UfXcWekoVfCF-Eb7HBYgVz59m"' (ϵͳ�Ҳ���ָ�����ļ���
) @ error/delegate.c/ExternalDelegateCommand/516 {"exception":"[object] (ImagickException(code: 415): FailedToExecuteCommand `\"gs\" -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 \"-sDEVICE=pngalpha\" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \"-r72x72\" -dPrinted=false \"-sOutputFile=C:/Users/84660/AppData/Local/Temp/magick-Ur8OfJdJ8WzKRKRp1M3pYsWnK1tB2l5E%d\" \"-fC:/Users/84660/AppData/Local/Temp/magick-_EVrlnoxRn8PG1KhwRJpXlx5LH75faSf\" \"-fC:/Users/84660/AppData/Local/Temp/magick-um7P_A9UfXcWekoVfCF-Eb7HBYgVz59m\"' (ϵͳ�Ҳ���ָ�����ļ���

) @ error/delegate.c/ExternalDelegateCommand/516

这个错误通常是由于Imagick无法找到Ghostscript(gs)而引起的。Ghostscript是Imagick用于处理PDF文件的依赖程序。要解决这个问题,你需要确保Ghostscript已经安装并且在系统的环境变量中。你可以按照以下步骤来解决这个问题:

  1. 首先,确保你已经安装了Ghostscript。你可以从Ghostscript的官方网站下载并安装它:https://www.ghostscript.com/download.html

  2. 安装完成后,将Ghostscript的安装目录添加到系统的环境变量中。这样Imagick才能找到Ghostscript。

  3. 重新运行你的PHP代码,应该就不会再出现这个错误了                                  

你可以用以下的方法解决这个问题:
    1. 检查你的电脑是否已经安装了 Ghostscript。如果没有,请下载安装:你可以从 Ghostscript 的官方网站下载。
    2. 如果你已经安装了 Ghostscript,确保 Ghostscript 的路径已经添加到了系统环境变量 PATH 中。你可以在命令行输入 'gs',如果系统能够找到并执行它,就说明 PATH 设置正确。
    3. 如果 Ghostscript 已安装,但没有在 PATH 中,你需要将其添加到 PATH。在 Windows 中,你可以在"系统属性" -> "高级" -> "环境变量"中修改 PATH。
    4. 如果你做了以上的检查,但问题仍然存在,那么可能是 Imagick 在尝试调用 Ghostscript 时没有正确的权限。你可能需要以管理员权限运行你的 PHP 脚本,或者赋予运行脚本用户足够的权限。这部分的操作可能需要你对 Windows 系统权限有所了解。

 错误信息2: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/413 {"exception":"[object]

1. Edit the ImageMagick policy file :

/etc/ImageMagick-6/policy.xml

2. Locate the following lines (usually at the very bottom of the file, around lines 89 to 95) :

<!-- disable ghostscript format types -->
  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="PS2" />
  <policy domain="coder" rights="none" pattern="PS3" />
  <policy domain="coder" rights="none" pattern="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />

3. Comment or remove those entries and restart the Web server service.

或者其他方案试试:

Imagemagick的安全策略似乎不允许我执行从pdf到png的转换。 转换其他扩展名似乎是可行的,只是不能使用pdf。 自从安装以来,我还没有更改任何imagemagick设置...如果操作系统很重要,我正在使用Arch Linux

1
2
3
user@machine $ convert -density 300 -depth 8 -quality 90 input.pdf output.png
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert: no images defined `output.png' @ error/convert.c/ConvertImageCommand/3288.
  • 未经授权将ImageMagick复制为PDF到图像

 


好吧,我加了

1
  <policy domain="coder" rights="read | write" pattern="PDF" />

在/etc/ImageMagick-7/policy.xml中的之前,这使其可以再次工作,但不确定其安全性。

posted on 2024-01-30 11:53  andydaopeng  阅读(307)  评论(0编辑  收藏  举报

导航