ImageMagick缩略图生成:超过30秒的最大执行时间

6

3
谷歌首页关于“Maximum execution time exceeded PHP”的搜索结果页面全部都是专门解释如何修复这个问题的文章。 - Polynomial
如果您能提供您的ImageMagick命令和版本,那就太好了。 - fmw42
6个回答

7
我知道这个问题很老,但我遇到了同样的问题,最大执行时间为180秒(这是完全不可接受的)。经过深入挖掘,我找到了问题的根源和解决方案,并想在这里分享给未来遇到此问题的用户。
ImageMagick超时的问题是由其OpenMP扩展相关的错误导致的。基本上,OpenMP扩展应该允许并行处理以加快速度。然而,如果您的服务器上有多个处理器或多个处理核心,则并行进程实际上可能会阻止彼此执行并使整个过程停滞。
我发现最好的解决方案是禁用OpenMp并重新编译ImageMagick包。
以下是一篇更好地描述了我刚才所说内容的文章(其中包括一个链接,指导如何检查您的处理器数量和处理核心数量): http://www.daniloaz.com/en/617/systems/high-cpu-load-when-converting-images-with-imagemagick/ 以下是禁用和重新编译包的说明: http://mapopa.blogspot.com/2011/10/php-image-slow-smp-magick-on-ubuntu.html 注意:第一行代码有一个拼写错误。它应该是:
apt-get build-dep imagemagick

嘿...你知道OpenMP的东西能否用PHP检测到吗? - thelolcat
在终端提示符处,键入 identify -version 并查找“特性”。 - Mark Setchell
嗯,我在一个盒子上安装了OpenMP,并使用Imagick扩展来缩略图像。特别是我通过屏幕会话同时运行多个Imagick。没有注意到任何阻塞问题。 - quickshiftin

3

当启用OpenMP时,ImageMagick可能会出现挂起问题,因此您可以尝试禁用OpenMP重新构建它 - 正如Greg所指示的那样。

要查看是否启用了OpenMP,请在终端提示处输入:

identify -version 

在“功能”下查找OpenMP。

作为一种快速测试和可能的解决方法,您可以尝试禁用ImageMagick中的多线程,这样可以防止OpenMP做任何事情。

要实现这一点,在调用任何IM函数之前,将ImageMagick环境变量MAGICK_THREAD_LIMIT设置为1即可。

putenv('MAGICK_THREAD_LIMIT=1');

Reference material: here.


2
问题是,如果您在ImageMagick中启用了OpenMP,则ImageMagick将使用多个CPU核心。如果您正在使用基于线程的PHP-FPM,则您在php.ini配置中设置的max_execution_time只针对单个CPU。
在终端中执行: convert -list resource 并查看 Thread 值。它会大于1。
您可以通过进入ImageMagick policy.xml将线程减少到1:
<policy domain="resource" name="thread" value="1"/>

通过convert -list resource再次验证线程限制,应该为1。

现在重新启动您的PHP-FPM。例如:service php7.1-fpm restart,现在您将看到PHP使用您设置的确切max_execution_time


如果您无法使用终端,也可以直接通过PHP设置线程限制。您也可以直接通过PHP设置线程限制:

Imagick::setResourceLimit(Imagick::RESOURCETYPE_THREAD, 1);
echo Imagick::getResourceLimit(Imagick::RESOURCETYPE_THREAD);

如果Imagick已经编译为ImageMagick版本6.7.8或更高版本,则可用此常量。


但是,由于我们现在使用的是单线程,因此ImageMagick的性能不如以前。因此,您可以增加policy.xml中的线程值,并将max_execution_time设置为:30 * number_of_threads

其他解决方案可能会更加困难,但可以实现与上述相同的结果。

  1. 重新构建未启用OpenMP的ImageMagick。
  2. 使用mod_php而不是PHP-FPM。

我在我的Mac上使用brew安装Imagick时遇到了同样的问题。通过在policy.xml中限制线程数解决了这个问题。谢谢。 - tiran

1

我不是专家,但我会尽力。

检查内存限制,至少增加256MB。

您可以通过time => convert -limit time 1 in.jp2 out.jpg来限制各种资源。 请参考此链接=> http://www.imagemagick.org/script/command-line-options.php?ImageMagick=9jcfn0pu5vfu215d7r2df55ah1#limit

如果您正在处理大型图像,可以检查图像文件大小,如果太大就退出。此外,您可以进行一些特殊的大型图像处理以加快速度,以免出现卡顿。 请参考此链接=> http://www.imagemagick.org/Usage/files/#massive


1
我建议使用set_time_limit函数。
如果将其设置为0,则脚本将无限制地执行。
set_time_limit(0);

当然,这样做可以解决您的问题,但这并不意味着ImageMagick制作缩略图应该需要那么长时间。
我建议首先检查传递给ImageMagick的所有数据是否都填充了。如果有空缺,可能会导致无限循环。此外,我建议尝试计算脚本实际所需的时间。

1
这与3年前Guest答案有何不同? - Uyghur Lives Matter

-1
尝试在你的PHP文件顶部添加<?php set_time_limit(0); ?>

这根本与此无关。执行时间只有几秒钟,而它生成了这种执行时间错误。 - user901050

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