为什么当我在 laravel 应用程序中运行 ghostscript 进程时浏览器会挂起?

Why does the browser hangs when I'm running a ghostscript process in a laravel application?

提问人:Toni Joe 提问时间:11/9/2023 最后编辑:KenSToni Joe 更新时间:11/9/2023 访问量:26

问:

我正在使用 Laravel 10 构建一个 PDF 压缩器应用程序。我正在使用 Process 类在服务器上执行 Ghostscript 命令:

$cmd = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile={$output} {$input}";
$process = new Process(explode(' ', $cmd));
$process->setTimeout(3600);
$process->run();

以上代码按预期工作,压缩后的PDF生成成功。

我唯一的问题是,在压缩过程中,页面无法重新加载并挂起,直到该过程完成。

有没有办法在重新加载页面时终止进程,或者有更好的方法来处理这种类型的应用程序?

Laravel 工艺

评论

0赞 ZeNix 11/9/2023
您可以使用队列来完成,我认为最好根据您的需要使用。Laravel Jobs

答:

0赞 K J 11/9/2023 #1

Ghostscript 不是压缩器,远非如此,它是一个打印文件重写器。这意味着随着组件的添加,文件通常会变大而不是变小。

以这个例子为例,它在一个页面中涵盖了许多不同类型的常见 PDF 功能。

enter image description here

需要注意的是文件较大并且缺少对象。

source 有 60 个对象,conversion 有 68 个对象 那么为什么会有区别呢?

  • 该版本已从 1.7(最常见)降级为 lessor 1.4,因此如果可能的话,任何 1.5、1.6 或 1.7 功能都会在 1.4 兼容对象中重新生成(可能需要将某些功能转换为 2 个或更多对象,但这可能并不总是可行的。

  • 有一些字体需要更改,这通常会添加或多或少的对象。如果静默运行(-q 或 -dQUITE),则不会看到是否由于字体而挂起。

Loading font Helvetica (or substitute) from %rom%Resource/Font/NimbusSans-Regular
Loading CIDFont KaiTi_GB2312 substitute from %rom%Resource/CIDFSubst/DroidSansFallback.ttf
Loading CIDFont STSong-Light substitute from %rom%Resource/CIDFSubst/DroidSansFallback.ttf
  • GS 不会传输存在时未专门针对的对象,因此不会特别处理 QR 码和透明盖章。(虽然右边似乎有一些奇怪的红色残留物?

因此,总体而言,该文件已减少为更大,更符合标准的文件。大多数PDF已经进行了最佳压缩,因此尝试一般地重新压缩是通往灾难的途径,需要逐个自定义每个对象的目标,以确定现有对象压缩是否足以快速解压缩,或者是否可以获得收益(除了黑白图像文件外很少见)。

请注意,在不同的 GhostScript 运行中,非常相似的源文件的字节数减半(即使包括添加的字体),而不会弄乱 1.7 功能或 /ebook 分辨率,因此只需“重建”即可。它确定可以“改进”某些对象的压缩,并且不删除任何对象!

具体到您的问题是,GS(与所有 PDF 操作一样)必须具有 100% 的输入和输出文件的独占处理器使用,直到所有线程完成并且该过程自然完成。因此,实际上是一个在内部使用并行进程的串行任务,通常不能在外部线程上进行。

评论

0赞 Toni Joe 11/10/2023
非常感谢,兄弟。我不知道。我很感激