我们正在使用此库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文件,我必须每次都重新启动队列工作程序。
还有其他选择吗?
注意 - laravel-snappy包装器中的类Knp\Snappy\AbstractGenerator
的实例是protected
。所以我不能直接调用它的方法。
参考 - https://github.com/barryvdh/laravel-snappy/blob/master/src/PdfWrapper.php#L20
答案 0 :(得分:0)
Reff: - Read this doc
主管配置
Supervisor是Linux操作系统的进程监视器,它将自动重新启动队列:listen或queue:如果失败则执行命令。要在Ubuntu上安装Supervisor,您可以使用以下命令:
sudo apt-get install supervisor
Supervisor配置文件通常存储在/etc/supervisor/conf.d目录中。在此目录中,您可以创建任意数量的配置文件,指示主管如何监视您的进程。例如,让我们创建一个laravel-worker.conf文件来启动和监视队列:工作过程:
[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个队列:工作进程并监视所有这些进程,如果失败则自动重新启动它们。当然,您应该更改命令指令的队列:work sqs部分以反映您选择的队列驱动程序。
创建配置文件后,您可以使用以下命令更新Supervisor配置并启动进程:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
答案 1 :(得分:0)
我没有使用该库,但据我所知,有一个用于生成PDF的Generator类。
释放此类后,它会删除所有tmp文件,因为会调用析构函数。
有对
的实现的引用Knp\Snappy\AbstractGenerator
喜欢$generator = new SomeConcreteGenerator();
似乎由包装器保存,因此您无法将其设置为null。
您可能会获得包装器,它通过
保存具体的生成器$pdf = App::make('snappy.pdf.wrapper');
因此,您可以通过$pdf = null
释放包装器,然后再创建一个新包装器。在创建1000个Pdfs之后,你必须这样做。
这种方法的问题是,服务通过$this->app->singleton(...)
作为单例绑定到DIC。 See source code。
因此它保留了我们想要发布的引用。
尝试通过将源代码修改为$this->app->bind(...)
而不是$this->app->singleton(...)
来进行常规绑定。
(您不应该调用__destruct()
,因为您基本上会破坏DIC拥有的对象。)