0

我们正在使用这个库laravel-snappy在队列中生成 PDF。

该库旨在在执行脚本后删除所有 tmp 文件。这是由于Knp\Snappy\AbstractGenerator类中的以下代码:

public function __destruct()
{
    $this->removeTemporaryFiles();
}

参考 - https://github.com/KnpLabs/snappy/blob/master/src/Knp/Snappy/AbstractGenerator.php#L57

由于我们在队列作业和 Laravel 中使用它,一旦queue:work命令启动,它将继续运行,直到手动停止或关闭终端。

因此,要清理 tmp 文件,我每次都必须重新启动队列工作程序。

有没有其他选择?

注意 - Knp\Snappy\AbstractGeneratorlaravel-snappy 包装器内的类实例是protected. 所以我不能直接调用它的方法。

参考 - https://github.com/barryvdh/laravel-snappy/blob/master/src/PdfWrapper.php#L20

4

2 回答 2

0

参考:- 阅读此文档

主管配置

Supervisor 是 Linux 操作系统的进程监视器,如果 queue:listen 或 queue:work 命令失败,它将自动重新启动它们。要在 Ubuntu 上安装 Supervisor,您可以使用以下命令:

sudo apt-get install supervisor

Supervisor 配置文件通常存储在 /etc/supervisor/conf.d 目录中。在这个目录中,你可以创建任意数量的配置文件来指示主管应该如何监控你的进程。例如,让我们创建一个 laravel-worker.conf 文件来启动和监控一个 queue:work 进程:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

在这个例子中, numprocs 指令将指示 Supervisor 运行 8 个 queue:work 进程并监控所有这些进程,如果它们失败则自动重新启动它们。当然,您应该更改命令指令的 queue:work sqs 部分以反映您选择的队列驱动程序。

创建配置文件后,您可以使用以下命令更新 Supervisor 配置并启动进程:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*
于 2017-11-09T07:46:24.107 回答
0

我不使用该库,但据我了解,有一个生成器类可用于生成 PDF。

一旦这个类被释放,它就会删除所有的 tmp 文件,因为析构函数被调用了。

有一个实现的参考

Knp\Snappy\AbstractGenerator

喜欢$generator = new SomeConcreteGenerator();

这似乎由包装器持有,因此您不能将其设置为空。

你可能会得到一个包装器,它通过

$pdf = App::make('snappy.pdf.wrapper');

因此,您可以通过释放包装器$pdf = null,然后制作一个新包装器。您必须在创建 1000 个 Pdf 之后执行此操作。

这种方法的问题在于,服务作为单例通过$this->app->singleton(...). 见源代码

所以它保留了我们想要发布的引用。

试一试,通过将源代码修改为$this->app->bind(...)而不是$this->app->singleton(...).

请参阅此处的绑定

(您不应该调用__destruct(),因为您基本上会破坏 DIC 拥有的对象。)

于 2017-11-09T09:36:48.133 回答