首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除由laravel-snappy生成的临时目录中的文件

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

Stack Overflow用户
提问于 2017-11-09 15:30:07
回答 2查看 2.3K关注 0票数 0

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

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2017-11-09 15:46:24

Reff:- Read this doc

主控引擎配置

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

代码语言:javascript
复制
sudo apt-get install supervisor

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

代码语言:javascript
复制
[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配置并启动进程:

代码语言:javascript
复制
sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*
票数 0
EN

Stack Overflow用户

发布于 2017-11-09 17:36:48

我不使用这个库,但据我所知,有一个Generator类可以用来生成PDF。

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

这里有一个对

代码语言:javascript
复制
Knp\Snappy\AbstractGenerator

$generator = new SomeConcreteGenerator();一样

它似乎由包装器持有,所以您不能将其设置为null。

您可能会得到包含混凝土生成器的包装器

代码语言:javascript
复制
$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所拥有的对象。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47196237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档