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

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

我最初计划使用PECL imagick扩展,但后来我读了这篇文章:</ p>



如果完全不支持Imagick并且不是由ImageMagick团队创建的。 所以我不知道在这一点上告诉你什么,只是使用PHP exec()来做所有事情。 你没有从Imagick获得太多东西,它不支持许多较新的Imagemagick功能。</ p>
</ blockquote>
</ blockquote>

如果我决定使用ImageMagick ,我应该避免使用imagick扩展而是使用 shell_exec()</ code>?</ p>
</ div>

展开原文

原文

In the past I've used GD when working with images, but I've read ImageMagick is better than GD and am considering using it in my next project.

I initially just planned on using the PECL imagick extension, but then I read this post on the ImageMagick forum:

Imagick is not supported well if at all any more and was not created by the ImageMagick team. So I am not sure what to tell you at this point other than to just use PHP exec() for everything. You are not gaining much if anything from Imagick and it does not support many of the newer Imagemagick features.

If I decide to use ImageMagick, should I avoid the imagick extension and instead use shell_exec()?

1个回答

If It is possible for you to do everything through exec then it is probably the most performant way of calling ImageMagick.

If you want to use the Imagick API feel free, it is maintained (I'm a maintainer) and if you find any features of ImageMagick that are not exposed through it, please let us know: https://github.com/mkoppanen/imagick

The only limitation on calling ImageMagick through either exec or Imagick is that you really don't want to be calling any image processing functions directly in a web-server. It is much, much, much better to have the image processing queued up in a background task, and processed by a 'queue processor' so that your web-server isn't being slowed down by the image processing.

The queue processor I use is a simple setup using:

  • Supervisord to run a PHP script.

  • A small PHP script that waits to read image processing requests off of a queue, unpack the arguments and call the appropriate image processing function.

  • It then saves the processed file. You could use event notification to tell the web-server the processed file is now available; instead of that, I use consistent hashing to generate the filename. That allows the web-server to check whether the file has been generated or not, just by checking file_exists(). e.g. if the function to generate the image is charcoalimage the generated filename would be "charcoalimage_".sha1($parameters), so both the web-server wanting the image and the queue processor can calculate the same filename.

  • While it's being processed any requests for that image while it hasn't been generated are 'delayed' by sleeping for a fraction of a second. The browser redirected to the same URL but with an extra parameter added, to try to prevent browsers from thinking there is a redirect loop. When the image has been made by the background task, obviously the file is just served by the web-server.

The queue setup described above is implemented in code here - however it is really quite poorly written, and even more poorly documented so am not sure it will be much help as it is.

It may be easier to understand by going to http://www.phpimagick.com/ and finding an example that is slow to generate (such as Oilpaint Image), and watching the network tab in your browser.

When a request for an image is made, the original url:

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

sends a request to the background processing queue, sleeps a little while, and redirects the browser to:

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

If the image has been generated, it is now served up, otherwise the browser is now redirected to:

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

etc. until either the image is generated (and so served) or the browser gets fed up and stops following the redirects.

The whole point of the above is that image processing is really, really slow. For some of the functions in ImageMagick, it's not unusual for the processing to take 20-40 seconds. You really don't want any slow requests in PHP. Everything should be either completed very fast, or queued up to a background task.

Once slow things are in a queue and being processed by a background task, it becomes absolutely trivial to throw more processing resources at it as required, monitor the queue for latency, or failed jobs. All of those things are much harder to do when the processing is being done in the web-server.

duanhuizhe6767
duanhuizhe6767 谢谢,很高兴知道! 当你说使用队列处理器处理图像更好时,你的意思是使用不同的服务器进行图像处理吗?
6 年多之前 回复
立即提问
相关内容推荐