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

utugiqy6  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在使用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。
我唯一的问题是,在压缩过程中,页面无法重新加载,并挂起,直到过程完成。
当我重新加载页面时,有没有一种方法可以杀死进程,或者有没有更好的方法来处理这种类型的应用程序?

lztngnrs

lztngnrs1#

Ghostscript不是一个压缩器,远远不是,它是一个打印文件重写器。这意味着文件通常可以更大,而不是更小的组件被添加。
以这个例子为例,它在一个页面中涵盖了许多不同类型的常见PDF功能。
x1c 0d1x的数据
需要注意的是文件更大,对象丢失。
源有60个对象,转换有68个,为什么有区别?
以及

  • 该版本已从1.7(最常见)降级为lesser 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已经优化压缩,所以试图重新压缩一般是一个灾难的路线,每个对象一个接一个的自定义目标,需要确定现有的对象压缩是否足够好,以快速解压缩或是否可以取得收益(罕见的B&W图像文件除外)。
请注意,一个非常相似的源文件在不同的GhostScript运行时字节数减半(即使包括添加的字体),而没有干扰1.7的功能或/ebook分辨率,所以只是简单地“重建”。它确定压缩可以“更好”的一些对象,并删除任何!
具体到你的问题是,GS(与所有PDF操作一样)必须独占处理器使用100%的输入和输出文件,直到所有线程完成,过程自然完成。因此,实际上是一个串行任务,内部使用并行进程,通常不能外部线程。

相关问题