我应该使用PHP扩展程序来处理ImageMagick还是只使用PHP的Exec()函数运行终端命令?

7
我需要为用户上传到我的网站的图像执行以下图像操作:
  1. 调整图像大小(如果大于某个尺寸)
  2. 将所有图像格式转换为jpg格式
  3. 在所有图片底部添加水印
我需要使用MagickWand或iMagick扩展吗?还是只需在PHP的exec函数中运行终端命令即可?
PHP扩展是否更好一些?哪个更快,性能更好(该网站可能有很多用户,并且每次图像处理都会有大量的操作)?

通过使用扩展,您可以更轻松地将代码移植到其他系统,例如。 - k102
使用 exec() 会有更高的开销,因为您需要生成一个 shell,运行 imagick,并等待 imagick 加载它所需的任何共享库等。相比之下,使用嵌入在 PHP 中的版本将具有一次性启动成本。 - Marc B
3个回答

12
我想对 drew010 的答案提出反对意见。在他的答案中,他说:

你使用 PHP 扩展而不是使用 exec 或类似的函数会受益很多。内置的扩展将更快,使用的内存更少,因为您不必生成新的进程并读取输出

对于处理图像来说,这是正确的。嗯,我知道通过使用 PHP 的 exec() 函数(或类似函数)调用 ImageMagick 二进制文件会带来额外的开销,然而我不清楚究竟有多少开销。
但是这还有另一面。如果通过扩展将 ImageMagick 代码嵌入到 PHP 中,则每个使用 PHP 的请求无论是否处理图像,都会占用更多内存。如果您正在使用 Apache 的mod_php,那么这将成为一个更大的问题,因为现在即使它正在提供 HTML 文件,您服务器上的每个请求都在内存中具有 ImageMagick 库! 所以这真的取决于情况。你确实想尽可能降低 PHP 的内存占用。如果您正在处理需要 ImageMagic 的大量请求并且正在使用 FastCGI 或php_fpm,那么使用嵌入式 ImageMagick 可能会更好。但是,如果您只偶尔使用 ImageMagick 处理请求和/或使用Apache 的 mod_php,那么通过exec()调用 ImageMagick 可能会获得更好的性能。

这是...完美的! - Robin

9
您会从使用PHP扩展中获得很多好处,而不是使用exec或类似的函数。内置扩展将更快,使用的内存更少,因为您不必生成新进程并读取输出。图像对象将直接在PHP中可用,而无需读取文件输出,这应该使图像更容易处理。
如果您有一个繁忙的站点,创建大量进程来编辑图像可能会开始减慢速度并消耗额外的内存。

2
您可能还想包含一些关于大多数(共享)主机出于安全原因阻止exec()的信息。 - Bailey Parker
1
内置扩展将更快,使用更少的内存。您有任何参考资料吗?我很想看到一些基准测试,以查看它是否显着更快。我知道调用convert二进制文件会生成一个新进程,这比使用嵌入式库要慢,但是我管理着许多繁忙的站点,它们以这种方式运行,并且它们似乎表现良好。我很想知道实际开销是多少。 - Josh
我没有直接的基准测试数据,我的说法只是基于这样一个事实:生成的进程将消耗至少一些内存,具体取决于它们正在执行什么任务。PHP扩展应该很快,因为它们被编译到PHP二进制文件中,并直接调用库文件来完成工作。在这种特殊情况下,我认为内存使用量会更少,因为作者可能已经让ImageMagick处理图像并将其输出到文件中,然后再使用PHP将其读回内存中,以便可能将图像返回给浏览器。 - drew010
GD是最常用的用于处理图像的“扩展”;它运行缓慢且消耗内存非常快。一般来说,一个已执行的二进制文件(例如imagemagick)不会遇到速度或内存问题。 - Salman A

1

我经常使用PHP GD http://php.net/manual/en/book.image.php

你可以通过它来调整大小、转换为JPG格式并添加水印。我知道你的帖子中提到了必须使用MagickWand或iMagick,但我想提供这个选项,以防它对你有用。


2
GD是一种选择,但如果你问我,它更像是最后的手段。我个人对GD的看法是它速度慢、占用内存多且基础。GD还会忽略照片中的色彩配置文件,这是一个重大缺陷。因此,如果你要处理专业照片,请远离GD,除非你想要色彩饱和的照片(主要是红色)。就性能、内存使用、代码减少和图像质量而言,Imagick毫无疑问是更好的选择。 - TheCarver
还想提一下,与强大的图像处理软件ImageMagick相比,GD的图像缩放算法还有待改进。 - Chris Seufert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接