Привет всем,
Мой сценарий: у меня есть работа, которая отправляет электронное письмо с прикрепленным файлом pdf. PDF-файл создается в описании задания () и прикрепляется к электронному письму. Чтобы сделать пользовательский интерфейс более удобным, я использовал задание очереди для отправки электронной почты. Итак, все остальные электронные письма работают нормально, кроме случаев, когда я создаю PDF: loadView. Кроме того, PDF-файл отлично работает на локальном хосте (WAMP). Однако он генерирует указанное выше исключение и находится в таблице failed_jobs в базе данных.
Пример моей работы Class :: EmailTestPdf
class EmailTestPdf implements ShouldQueue
{
protected $data;
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(array $data)
{
$this->data = $data;
}
public function handle()
{
$d=$this->data;
$d['doc'] = PDF::loadView('email.test',compact('data','survey'));
Mail::send('email.testpdf', $d, function ($message) use ($d)
{
$message->from([email protected], 'Tester');
$message->subject('Subject Title');
$message->to('[email protected]');
$message->attachData($d['doc']->output(), 'test.pdf', ['mime' => 'application/pdf']);
});
}
}
В методе контроллера я использовал:
EmailTestPdf::dispatch($data)->delay(now()->addSeconds(5));
Вышеупомянутое отлично работает на localhost. Однако на живом сервере он не работал. Кроме того, на сервере CentOS я реализовал руководитель, как показано ниже:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/coreso5/ptesting/artisan queue:work database --sleep=3 --
tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/home/coreso5/ptesting/storage/logs/worker.log
После запуска теста при отправке pdf он выдаст ошибку, которую я обнаружил в таблице failed_jobs.
ErrorException: Undefined index: SCRIPT_FILENAME in /ptesting/vendor/dompdf/dompdf/src/Css/Stylesheet.php:175
...............
Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined index...', '/ptesting/v...', 175, Array)
да, и я ничего не видел
Если ваша работа - это только отправка электронной почты, и вы не собираетесь использовать ее где-либо еще, вам не нужно создавать специальную работу, laravel может поставить вашу электронную почту в очередь.
Mail::to([email protected])
->queue(new EmailTestPdf($data));
Что касается вашей ошибки, похоже, что проблема возникает при создании PDF-файла. Вы уверены, что это работает вне этой работы? что происходит, когда вы это делаете;
$d['doc']->output();
Я имею в виду, что это способ реализации domPDF. Он ищет какой-то URL-адрес сервера. и я не могу думать о том, чтобы понять это правильно
Можете ли вы вставить трассировку ошибки? он должен быть на /home/coreso5/ptesting/storage/logs/worker.log
. Какую версию dompdf вы используете? Можете ли вы показать код для этой строки: /ptesting/vendor/dompdf/dompdf/src/Css/Stylesheet.php:175
Статус: 500 Внутренняя ошибка сервера Cache-Control: no-cache, private date: Sun, 16 Dec 2018 12:33:25 GMT Content-type: text / html; charset = UTF-8 <! DOCTYPE html> <! - Symfony \ Component \ Debug \ Exception \ FatalErrorException: превышено максимальное время выполнения 30 секунд в файле / home / coreso5 / ptesting / vendor / laravel / framework / src / Illumina te / Cache / FileStore.p hp on line 49 Трассировка стека: 1. Symfony \ Component \ Debug \ Exception \ FatalErrorException- & gt; () / home / coreso5 / ptesting / vendor / laravel / framework / src / Illumina te / Кэш / FileStore.p hp: 49
Maximum execution time of 30 seconds
, вам нужно увеличить время max_execution, только для этого скрипта добавьте это в начало метода дескриптора set_time_limit(0);
или глобально stackoverflow.com/questions/16171132/…Спасибо за ответ. Но почему-то это произошло из-за неисправности супервизора обработки серверов. У меня самое высокое время исполнения.
вы проверяли журналы laravel? (хранилище> журналы)