删除laravel-snappy生成的临时目录中的文件

时间:2017-11-09 07:30:07

标签: php laravel laravel-snappy

我们正在使用此库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

2 个答案:

答案 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(...)来进行常规绑定。

See here on binding

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