【问题标题】:Speed up PHP Imagick library PDF -> PNG conversion (20seconds !)加快 PHP Imagick 库 PDF -> PNG 转换(20 秒!)
【发布时间】:2012-10-28 13:33:05
【问题描述】:

我正在使用Imagick 将PDF 的第一页转换为PNG 图像。它正在工作,但速度很慢。

对于大约 100kb 的 PDF,转换需要 8 到 20 秒。

有没有办法加快转换速度?

我的代码:

$im = new Imagick($url);
$im->setIteratorIndex(0);
$im->setCompression(Imagick::COMPRESSION_LZW);
$im->setCompressionQuality(90);
$im->setImageFormat("png");
$im->writeImage('C:/Shared/test.png');

【问题讨论】:

  • header('Content-type: image/jpeg'); 与输出不匹配。你输出PNG。并不是说这会影响速度,但您可能希望首先解决这个问题。
  • 可以,但是转换还需要很多时间
  • 正如评论中所写,改变它可能没有速度影响,但你可能只想修复它,因为它不正确。如果您不希望用户等待,您可以留言并在 20 秒后重定向,并使用会话在后台进行处理(如何完成取决于所使用的 PHP SAPI)。

标签: php imagick


【解决方案1】:

有没有办法加快转换速度?

当然,升级机器,使其具有更强的处理能力、更多内存和更快的磁盘。

此外,您似乎使用的是 Windows 操作系统。我建议您切换到 Linux 系统并编译针对其运行的计算机架构优化的库。

【讨论】:

  • 是的,很可能切换到工具开发人员使用的原生操作系统总是一个好主意。
  • 好的,没有任何技巧可以加快转换速度。感谢您的评论
  • 如果这些都不是你的选择,那么如何让它更快呢?代码看起来很精确。也许在命令行上调用 imagemagick 比 PHP 库更快(参见shell_exec)。
  • 看来处理器/内存/磁盘是这里的瓶颈。图像处理要求很高。如果您无法在优化系统上切换到优化库,那么您无能为力。
  • 事实上,在没有 Imagick 的情况下使用 GhostScript 可以加快转换速度。看我的回答
【解决方案2】:

事实上,我不需要 Imagick 库来生成 PDF 第一页的简单 JPG 预览,我只需要 GhostScript。

使用 GhostScript 进行命令行转换总是比 Imagick 快(命令行或通过 PHP)

以 12 页和 650kb 为例:

  • 命令行 GhostScript => 0.6 秒
  • 命令行 Imagick => 0.8 秒
  • PHP 扩展 Imagick => 2.22 秒

对于某些文档,Imagick 需要 20 秒,而使用直接 GS 命令行则需要 1.5 秒。

这是我的测试脚本

   <?php

    $pathToPdf = realpath("in.pdf");

    $pathToJpg = "./out.jpg";
    $pathToPng = "./out.png";

    try
        {

        $time_start = microtime(true);      
        $gsCall = "\"C:\Program Files (x86)\gs\gs9.06\bin\gswin32.exe\" -q -dBATCH -dMaxBitmap=300000000 -dNOPAUSE -dSAFER -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dFirstPage=1 -dLastPage=1 -sOutputFile=\"{0}\" \"{1}\" -c quit";
        $gsCall = str_replace(array('{0}', '{1}'), array($pathToJpg, $pathToPdf), $gsCall); // or use sprintf
        $str = exec($gsCall, $output=array(), $returnValue);
        echo $gsCall.'<br><br>';
        $time_end = microtime(true);
        $time = $time_end - $time_start;        
        if($returnValue == 0)              
            print "<br><br>Conversion OK ".$time;
        else 
            print "<br><br>Conversion failed.<br />".var_dump($output);     

        $time_start = microtime(true);          
        exec('convert "'.$pathToPdf.'[0]" "'.$pathToPng.'"', $output, $returnValue);                        
        $time_end = microtime(true);
        $time = $time_end - $time_start;
        if($returnValue == 0)              
            print "<br><br>Conversion OK ".$time;
        else 
            print "<br><br>Conversion failed.<br />".var_dump($output);

        $time_start = microtime(true);
        $im = new Imagick($pathToPdf);
        $im->setIteratorIndex(0);
        $im->setCompression(Imagick::COMPRESSION_LZW);
        $im->setCompressionQuality(90);
        $im->setImageFormat("png");
        $im->writeImage('\\\\DELL-PC\Shared\test.png');
        //$im->thumbnailImage(200, 0);
        //echo $im;
        $time_end = microtime(true);
        $time = $time_end - $time_start;
        print "<br><br>Conversion OK ".$time;
    }
catch(Exception $e)
{
    echo $e->getMessage();
}
?>

【讨论】:

  • 请注意,这可能是由于 Windows 平台效率低下造成的。在 Linux 上,我对 3 种方法(PHP Imagick、命令行 Imagick 和 ghostscript)进行了基准测试,发现它们花费的时间相同。
  • 我发现它依赖于 PDF 来转换(带有大图像)。但是 GhostScript 总是稳定的而不是 iMagick,但需要授权才能使用 Exec() 命令
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2012-02-06
  • 2017-07-26
  • 1970-01-01
  • 2014-05-29
  • 2015-05-12
相关资源
最近更新 更多