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

问题描述 投票:0回答:1

我正在使用 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 process
1个回答
0
投票

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

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

需要注意的是文件较大且对象丢失。

源有 60 个对象,而转换有 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 不会传输存在的非特定目标对象,因此 QRcode 和透明盖章没有得到特别处理。 (虽然右边好像有一些奇怪的红色残留物?)

因此,总体而言,文件已缩减为更大、更标准兼容的文件。

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

© www.soinside.com 2019 - 2024. All rights reserved.