通过PHP使用ImageMagick创建大型精灵 消耗100% CPU

Creating a large sprite with ImageMagick via PHP Consumes 100% CPU

提问人:Madara's Ghost 提问时间:1/14/2014 更新时间:2/2/2014 访问量:368

问:

所以我有这个:

exec("cd $upload_directory && convert \\( +append -limit memory 1 -limit map 1 *.jpg \\) -strip -trim -interlace Plane -quality 60 output.jpg

工作流程如下:

  • 用户上传 *.zip 文件,包含约 30 张图片,每张 2048x1152
  • 应用程序解压缩 zip 文件
  • 应用程序拍摄照片并从所有照片中制作一个大精灵
  • 然后,应用程序重定向到其他页面进行处理。

现在的问题是制作大型精灵。它消耗 100% 的 CPU(根据服务器上),当图像较多时会失败。此外,过程输出没有任何进一步的错误消息。topKilled

现在,我确信我可以通过在服务器上投入更多力量来解决这个问题,但我有一种感觉,我拥有的那个并不是最有效的。

我可以尝试什么来缓解该问题?

php imagemagick 精灵 cpu-usage

评论

1赞 Moe Tsao 1/14/2014
当您顶部时,您能看到该转换过程的内存消耗吗?看起来你正在那里制作一个非常大的图像。2048*1152*30*2(如果是16位)= 135MB。这将是添加任何层之前的最低内存要求。
0赞 Gilles 'SO- stop being evil' 1/14/2014
看起来进程超出了其 CPU 或内存限制。状态代码是什么?(如果您不知道如何在 PHP 中获取它,请在 shell 脚本的末尾添加。; echo $?
0赞 Madara's Ghost 1/14/2014
@MoeTsao:这怎么可能?所有图像的总重量不到 10MB
0赞 Madara's Ghost 1/14/2014
@Gilles:状态码为 。1
1赞 derobert 1/14/2014
@MadaraUchiha 压缩后,它们的重量不到 10MB。ImageMagick 可能正在解压缩它们以使用它们。我猜是 32 位,而不是 16 位,所以是 Moe 计算大小的两倍。

答:

1赞 Kovo 1/21/2014 #1

你有点回答了你自己的问题。你正在做一些非常密集的事情。预期的结果是 CPU 使用率将飙升。解压缩需要内存和 CPU。创建海量映像需要 IO、CPU 和内存。如果您曾经使用过 Photoshop,您会注意到您的系统内存和 CPU 总是飙升。处理图像并非易事。

如果要使用当前方法处理大型图像,则需要更强大的服务器。没有魔术参数可以使进程使用更少的内存。如果您有一张 32MB 的图像,那么在您尝试减小其大小之前,它将需要大量内存来读取它。

希望对您有所帮助!