【问题标题】:shell_exec() or imagick extension when using ImageMagick?使用 ImageMagick 时的 shell_exec() 或 imagick 扩展?
【发布时间】:2014-07-19 19:04:49
【问题描述】:

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

我最初只是打算使用 PECL imagick 扩展,但后来我在 ImageMagick 论坛上看到了this post

Imagick 没有得到很好的支持,而且不是由 ImageMagick 团队创建的。因此,除了对所有事情都使用 PHP exec() 之外,我不确定此时要告诉您什么。如果从 Imagick 获得任何好处,您并没有获得太多收益,而且它不支持许多较新的 Imagemagick 功能。

如果我决定使用 ImageMagick,我是否应该避免使用 imagick 扩展而使用 shell_exec()

【问题讨论】:

    标签: php imagemagick imagick


    【解决方案1】:

    如果您可以通过exec 完成所有操作,那么它可能是调用 ImageMagick 的最高效方式。

    如果您想免费使用 Imagick API,它已得到维护(我是维护者),如果您发现 ImageMagick 的任何功能未通过它公开,请告诉我们:https://github.com/mkoppanen/imagick

    通过 exec 或 Imagick 调用 ImageMagick 的唯一限制是您真的不想直接在 Web 服务器中调用任何图像处理函数。让图像处理在后台任务中排队并由“队列处理器”处理会好得多,这样您的网络服务器就不会因图像处理而减慢。

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

    • Supervisord 运行 PHP 脚本。

    • 一个小的 PHP 脚本,它等待从队列中读取图像处理请求、解包参数并调用适当的图像处理函数。

    • 然后保存处理后的文件。您可以使用事件通知来告诉 Web 服务器已处理的文件现在可用;取而代之的是,我使用一致的散列来生成文件名。这允许网络服务器检查文件是否已生成,只需检查 file_exists()。例如如果生成图像的函数是charcoalimage,则生成的文件名将是"charcoalimage_".sha1($parameters),因此需要图像的网络服务器和队列处理器都可以计算出相同的文件名。

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

    上面描述的队列设置是在代码here 中实现的——但是它确实写得很糟糕,而且文档记录也更差,所以我不确定它是否会有很大帮助。

    转到http://www.phpimagick.com/ 并找到一个生成速度较慢的示例(例如Oilpaint Image)并在浏览器中查看网络选项卡可能更容易理解。

    请求图片时,原始url:

    http://www.phpimagick.com/image/Imagick/oilPaintImage?image=Lorikeet&radius=5

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

    http://www.phpimagick.com/image/Imagick/oilPaintImage?image=Lorikeet&radius=5&job=1

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

    http://www.phpimagick.com/image/Imagick/oilPaintImage?image=Lorikeet&radius=5&job=2

    等等。直到图像生成(并因此提供)或浏览器厌倦并停止跟踪重定向。

    上面的重点是图像处理真的非常慢。对于 ImageMagick 中的某些功能,处理需要 20-40 秒的情况并不少见。您真的不希望在 PHP 中出现 任何 个缓慢的请求。一切都应该很快完成,或者排队等待后台任务。

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

    【讨论】:

    • 谢谢,很高兴知道!当您说最好使用queue processor 处理图像时,您的意思是使用不同的服务器进行图像处理吗?
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多