首页 > 解决方案 > 将PDF转换为图像时,PHP Imagick会挂起整个服务器

问题描述

我在 PHP 上使用扩展 Imagick 将 PDF 文件转换为图像,具体来说是 PNG 文件。当转换正在进行时,整个服务器总是挂起。我所做的是上传一堆 PDF 文件,循环浏览它及其页面以将其转换为图像。

这是代码。

foreach ($uploaded_file as $key => $value) {
  $upload_file_path = $upload_path.'/'.$value->name;
  $imagick = new Imagick();
  $imagick->setResourceLimit(6, 1);
  $imagick->setResolution(300, 300);
  $imagick->readImage($upload_file_path);
  $pages = $imagick->getNumberImages();

  for ($x=0; $x<$pages; $x++) {
    $imagick->readImage($upload_file_path.'['.$x.']');
    $imagick->setImageFormat('png');
    $imagick->writeImage($image_path.'/page-'.$x.'.png');
  }

  $imagick->clear();
  $imagick->destroy();
}

转换正在进行时,我无法访问服务器上的其他站点,并且转换时间过长。请帮忙。谢谢!

标签: phpimagick

解决方案


根据 PDF 的内容,转换可能确实非常繁重。您对此无能为力。

您已经尝试将线程总数降低到 2,但仍然需要考虑内存、I/O 延迟和 CPU 资源——而且您不知道服务器是否可以使用两个以上的线程。

可能可以做的是尝试使用 and 降低正在运行的进程的 I/O 和 CPU 优先级niceionice如果它们可用的话。您需要有一个合适的平台(Linux、BSD 或类似平台),并且可以使用niceionice工具;并且您需要一个专用的可执行 PHP 进程(可能不是 FastCGI,然后)并能够查询其 PID。

在 Linux 系统上,您可能会尝试将转换外包给 ImageMagick 二进制文件,然后将其包装起来,nice使其ionice变得容易——而且速度慢。

另一种可能性是看看你是否可以使用ghostscript而不是 Imagick。


推荐阅读