我在项目中使用Laravel 5.4和MySQL。
远程服务器是PHP Server 7
当用户将记录保存到数据库时,它还会创建一个队列作业来通知相关的公司官员。我的代码在控制器文件中
foreach($audit->mailusers AS $mailuser){
$this->dispatch(new SendAuditEmail($audit->id, $mailuser->name, $mailuser->email));
}
我正在为QUEUE DRIVER使用数据库。我的意思是它用.env文件写成:
QUEUE_DRIVER=database
如您所知,如果您正在使用"数据库"而不是" redis"或其他队列驱动程序,必须有" jobs"数据库中的表:
CREATE TABLE `jobs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`queue` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
`attempts` tinyint(3) unsigned NOT NULL,
`reserved_at` int(10) unsigned DEFAULT NULL,
`available_at` int(10) unsigned NOT NULL,
`created_at` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `jobs_queue_reserved_at_index` (`queue`,`reserved_at`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
另外如您所知,如果您想处理失败的作业,您的数据库中应该还有一个名为" failed_jobs"的表:
CREATE TABLE `failed_jobs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`connection` text COLLATE utf8mb4_unicode_ci NOT NULL,
`queue` text COLLATE utf8mb4_unicode_ci NOT NULL,
`payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
`exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
`failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
创建" failed_jobs" table( source ),首先你必须运行artisan命令:
php artisan queue:failed-table
此命令将在database \ migrations文件夹中创建一个迁移php文件
然后通过运行migrate命令,您可以创建failed_jobs表:
php artisan migrate
处理作业表中的作业:
php artisan queue:work
队列工作人员的行为如下:
1-如果工作在"工作"表失败,将其保存到" failed_jobs"表格和删除"工作"表
2-如果工作成功完成,只需从"工作中删除"表。不要再在任何地方保存,只需删除此作业即可。
最后,我的问题是: 如果队列工作程序成功完成一个作业,那么无论如何都要将此作业记录保存到名为的数据库中的任何其他表:" completed_jobs"。
因为,对我来说,能够这么说是很重要的: "安德森先生的邮件由Queue Worker于25.01.2018 15:42:20发送"
答案 0 :(得分:3)
Laravel解雇job events之前,之后和失败的工作。根据需要,您可以在事件后注册侦听器并存储已成功运行的作业记录。
在服务提供商的启动方法中:
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});