Imagick是使用ImageMagick库创建和修改图像的PHP扩展名。 HHVM也有一个Imagick版本。尽管这两个扩展名在其API中大多兼容,并且它们都称为ImageMagick库,但两个扩展名是完全独立的代码库。
也可以在https://bugs.php.net上报告错误,但响应时间可能较慢。
安装Imagick的最佳方法是通过软件包管理器,例如APT,YUM,Brew,因为它们还将为您安装ImageMagick。
如果您需要从源中编译Imagick,则首先应该安装ImageMagick,至少版本6.2.4,但是强烈建议使用更近期的版本,因为其中有许多错误修复。
一旦安装了ImageMagick,以下命令将编译并安装Imagick:
git clone https://github.com/Imagick/imagick
cd imagick
phpize && ./configure
make
make install
您还需要将extension=imagick.so添加到PHP INI文件中,以使PHP加载扩展名。
对于Windows,请同时安装Imagick和基础ImageMagick库,
一旦编译,Imagick就应该以与对其进行编译相同的ImageMagick进行运行。已知反对不同版本的ImageMagick会导致稳定性问题,因此不建议或支持。
如果在nixos上使用Imagick,您可能需要定义FontConfig_file,以避免加载字体时的警告消息,而Magick_configure_path则可以从Imagick :: getConfigureOptions()中获得所有可用的信息()。
库中几乎所有功能都在www.phpimagick.com上都有一个示例,您可以在其中看到示例代码来调用该功能,以及生成的图像或输出。
ImageMagick是Imagick Extension暴露于PHP的库有许多错误修复,这些错误修复了许多图像损坏问题。如果可能的话,我们强烈建议您升级到最新版本(大于6.9.1或7.x)。
PHP扩展Imagick通过调用ImageMagick库来起作用。尽管ImageMagick开发人员在避免错误方面非常注意,但不可避免地会在代码中存在一些错误。 ImageMagick还使用许多第三方库打开,阅读和操纵文件。这些图书馆的作者在编写代码时也要注意。但是,每个人都会犯错误,不可避免地会有一些错误。
由于ImageMagick用于处理图像,因此黑客可以创建包含无效数据的图像来尝试利用这些错误。因此,我们建议以下内容:
如果ImageMagick正在使用的库中,这样做将使黑客更难利用错误。
将其作为非常低的特权过程运行。应锁定来自PHP脚本的文件和系统资源,应锁定Imagick的PHP脚本。
验证所有图像文件都以与您支持的图像文件类型相对应的预期“魔术字节”开头,然后将其发送到ImageMagick进行处理。使用finfo_file() - 请参见下文。
在将图像处理的结果显示给用户之前,请检查图像处理的结果。在极不可能的情况下,黑客能够将任意文件输送到Imagick的输出中,检查它是一个图像文件,而不是要发送的应用程序的源代码,这是明智的预防措施。这可以通过以下代码完成:
<?php
$ finfo = finfo_open ( FILEINFO_MIME_TYPE );
$ mimeType = finfo_file ( $ finfo , $ filename );
$ allowedMimeTypes = [
' image/gif ' ,
' image/jpeg ' ,
' image/jpg ' ,
' image/png '
];
if ( in_array ( $ mimeType , $ allowedMimeTypes ) == false ) {
throw new SecurityException ( " Was going to send file ' $ filename ' to the user, but it is not an image file. " );
}这些建议不能保证任何安全性,但是它们应限制您对任何Imagick/ImageMagick相关安全问题的接触。
ImageMagick具有使用开放的多处理API的能力,能够使用多个线程立即处理图像。已知某些OpenMP的实现在某些环境中使用时会出现稳定性问题。
我们建议做以下一个:
通过使用编译标志“ -disable-openmp” set将OPENMP支持禁用OpenMP支持。
通过致电: Imagick::setResourceLimit(Imagick::RESOURCETYPE_THREAD, 1);禁用ImageMagick中的线程的使用:或Imagick::setResourceLimit(6, 1);如果您的Imagick版本不包含ResourceType_thread常数。
通过在ImageMagick'policy.xml文件中设置<policy domain="resource" name="thread" value="1"/>此文件可能位于/etc/imagemagick-6/policy.xml或类似位置的情况下,禁用ImageMagick中线程的使用。
如果您确实想在ImageMagick中使用OpenMP,则应通过Imagick调用它,则应彻底测试它在服务器上的行为正确。
文档需要大量工作。这里有一个在线编辑器:https://edit.php.net/贡献非常欢迎。
请参阅http://abi-laborator.pro/tracker/timeline/imagemagick/有关基础图像库的确切版本更改。