Php 使用ImageMagick时是否使用shell_exec()或imagick扩展?

Php 使用ImageMagick时是否使用shell_exec()或imagick扩展?,php,imagemagick,imagick,Php,Imagemagick,Imagick,在过去,我在处理图像时使用过GD,但我读过ImageMagick比GD更好,我正在考虑在我的下一个项目中使用它 我最初计划使用PECL imagick扩展,但后来我在ImageMagick论坛上读到: Imagick不再得到很好的支持,并且不是由ImageMagick团队创建的。因此,我不知道在这一点上要告诉你什么,除了在所有事情上都使用PHP exec()。Imagick不支持许多较新的Imagemagick功能,您从中收获不多 如果我决定使用ImageMagick,我是否应该避免使用imag

在过去,我在处理图像时使用过GD,但我读过ImageMagick比GD更好,我正在考虑在我的下一个项目中使用它

我最初计划使用PECL imagick扩展,但后来我在ImageMagick论坛上读到:

Imagick不再得到很好的支持,并且不是由ImageMagick团队创建的。因此,我不知道在这一点上要告诉你什么,除了在所有事情上都使用PHP exec()。Imagick不支持许多较新的Imagemagick功能,您从中收获不多


如果我决定使用ImageMagick,我是否应该避免使用imagick扩展而改用
shell\u exec()

如果您可以通过
exec
执行所有操作,那么这可能是调用ImageMagick最有效的方法

如果您想使用Imagick API,请放心,它是维护的(我是维护人员),如果您发现ImageMagick的任何功能没有通过它公开,请告诉我们:

通过exec或Imagick调用ImageMagick的唯一限制是,您确实不希望直接在web服务器中调用任何图像处理函数。让图像处理在后台任务中排队,并由“队列处理器”进行处理,这样您的web服务器就不会因为图像处理而减慢速度,这会好得多

我使用的队列处理器是一个简单的设置,使用:

  • 运行PHP脚本

  • 一个小PHP脚本,它等待从队列中读取图像处理请求,解压参数并调用相应的图像处理函数

  • 然后保存处理过的文件。您可以使用事件通知通知web服务器已处理的文件现在可用;相反,我使用一致哈希生成文件名。这允许web服务器检查文件是否已生成,只需检查文件_exists()。e、 g.如果生成图像的函数是
    charcoalimage
    ,则生成的文件名将是
    “charcoalimage”。sha1($parameters)
    ,因此需要图像的web服务器和队列处理器都可以计算相同的文件名

  • 在处理过程中,任何尚未生成该图像的请求都会因睡眠几秒钟而“延迟”。浏览器重定向到同一URL,但添加了一个额外参数,以防止浏览器认为存在重定向循环。当图像由后台任务生成时,显然该文件只是由web服务器提供的

上面描述的队列设置是用代码实现的,但是它的编写非常糟糕,而且文档记录更糟糕,所以我不确定它是否会有多大帮助

通过转到并查找生成速度较慢的示例(例如),并查看浏览器中的“网络”选项卡,可能更容易理解

请求图像时,原始url:

向后台处理队列发送请求,休眠一段时间,并将浏览器重定向到:

如果已生成图像,则该图像现在已提供,否则浏览器现在将重定向到:

直到生成图像(并提供服务)或浏览器厌倦并停止重定向

以上的要点是图像处理非常非常慢。对于ImageMagick中的一些函数,处理时间通常为20-40秒。您真的不希望PHP中出现任何缓慢的请求。一切都应该很快完成,或者排队等待后台任务


一旦队列中有慢的东西并由后台任务处理,则根据需要向其投入更多的处理资源、监视队列的延迟或失败的作业就变得非常简单。当处理在web服务器中完成时,所有这些事情都要困难得多。

如果您可以通过
exec
执行所有操作,那么这可能是调用ImageMagick最有效的方法

如果您想使用Imagick API,请放心,它是维护的(我是维护人员),如果您发现ImageMagick的任何功能没有通过它公开,请告诉我们:

通过exec或Imagick调用ImageMagick的唯一限制是,您确实不希望直接在web服务器中调用任何图像处理函数。让图像处理在后台任务中排队,并由“队列处理器”进行处理,这样您的web服务器就不会因为图像处理而减慢速度,这会好得多

我使用的队列处理器是一个简单的设置,使用:

  • 运行PHP脚本

  • 一个小PHP脚本,它等待从队列中读取图像处理请求,解压参数并调用相应的图像处理函数

  • 然后保存处理过的文件。您可以使用事件通知通知web服务器已处理的文件现在可用;相反,我使用一致哈希生成文件名。这允许web服务器检查文件是否已生成,只需检查文件_exists()。e、 g.如果生成图像的函数是
    charcoalimage
    ,则生成的文件名将是
    “charcoalimage”。sha1($parameters)
    ,因此需要图像的web服务器和队列处理器都可以计算相同的文件名

  • 在处理过程中,任何尚未生成该图像的请求都会因睡眠几秒钟而“延迟”。浏览器重定向到同一URL,但添加了一个额外参数,以防止浏览器认为存在重定向循环。当图像已被删除时