Мы используем эту библиотеку 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
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:*
Я не использую библиотеку, но, насколько я понимаю, есть класс 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.)