加速PHP Imagick库PDF->;PNG转换(20秒!)

加速PHP Imagick库PDF->;PNG转换(20秒!),php,imagick,Php,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->

我正在使用将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');
有没有办法加快转换速度

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


而且看起来您正在使用Windows操作系统。我建议您切换到Linux系统,编译针对其运行的计算机体系结构优化的库。

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

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

具有12页和650kb的示例:

  • 命令行GhostScript=>0.6秒
  • 命令行Imagick=>0.8秒
  • PHP扩展Imagick=>2.22秒
对于某些文档,Imagick需要20秒,而使用direct 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();
}
?>

是的,很可能切换到工具开发者使用的本地操作系统总是一个好主意。好的,没有任何技巧可以加速转换。谢谢你的评论,如果你没有选择,那么如何让它更快呢?代码看起来很精确。也许在命令行上调用imagemagick比PHP库快(请参见
shell\u exec
),处理器/内存/磁盘似乎是这里的瓶颈。图像处理要求很高。如果您不能在优化系统上切换到优化库,那么您就无能为力。如果事实上,在没有Imagick的情况下使用GhostScript可以加快转换速度。参见我的答案
标题('Content-type:image/jpeg')输出不匹配。您可以输出PNG。并不是说这对速度有影响,但您可能首先要修复它。当然,但转换仍然需要很多时间,正如注释中所述,更改它可能不会影响速度,但您可能只是想修复它,因为它不正确。如果您不想让用户等待,您可以在20秒后留下消息并重定向,通过会话在后台进行处理(处理方式取决于使用的PHP SAPI)。请注意,这可能是由于Windows平台上的不足。在Linux上,我对这3种方法(PHP Imagick、命令行Imagick和ghostscript)进行了基准测试,发现它们需要相同的时间。我发现转换依赖于PDF(大图像)。但GhostScript总是稳定的,而不是iMagick,但需要授权才能使用Exec()命令