Удаление файлов во временном каталоге, сгенерированном laravel-snappy

Мы используем эту библиотеку Laravel-мгновенная генерировать 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\AbstractGenerator внутри обертка Laravel-Snappy protected, Поэтому я не могу вызывать его методы напрямую.

Ссылка — https://github.com/barryvdh/laravel-snappy/blob/master/src/PdfWrapper.php#L20

0

Решение

Reff: — Прочитайте этот документ

Конфигурация супервизора

Supervisor — это монитор процессов для операционной системы Linux, который автоматически перезапускает команды queue: listen или queue: work в случае сбоя. Чтобы установить Supervisor в Ubuntu, вы можете использовать следующую команду:

sudo apt-get install 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 sqs командной директивы, чтобы отразить выбранный вами драйвер очереди.

После того, как файл конфигурации был создан, вы можете обновить конфигурацию Supervisor и запустить процессы, используя следующие команды:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*
0

Другие решения

Я не использую библиотеку, но, насколько я понимаю, есть класс Generator, который вы используете для создания PDF-файлов.

Когда этот класс освобожден, он удаляет все файлы tmp, потому что вызывается деструктор.

Существует ссылка на реализацию

Knp\Snappy\AbstractGenerator

лайк $generator = new SomeConcreteGenerator();

который, кажется, удерживается оболочкой, поэтому вы не можете установить его на ноль.

Вы, вероятно, получите обертку, которая содержит бетонный генератор через

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

Так что вы можете освободить обертку через $pdf = null а затем сделать новый. Вы должны будете сделать это после того, как будет создано около 1000 PDF-файлов.

Проблема с этим подходом состоит в том, что сервис связан с DIC как одиночный через $this->app->singleton(...), Посмотреть исходный код.

Таким образом, он сохраняет ссылку, которую мы хотим выпустить.

Попробуйте и сделайте регулярную привязку, изменив их исходный код на $this->app->bind(...) вместо $this->app->singleton(...),

Смотрите здесь о привязке.

(Вы не должны звонить __destruct() как вы в основном уничтожаете объект, который принадлежит DIC.)

0

По вопросам рекламы [email protected]