我在项目中使用了Laravel 5.4和MySQL。
远程服务器是PHP服务器7
用户将记录保存到数据库时,它还创建了一个队列作业来通知相关公司官员。我的代码在控制器文件中
foreach($audit->mailusers AS $mailuser){
$this->dispatch(new SendAuditEmail($audit->id, $mailuser->name, $mailuser->email));
}
我正在为队列驱动程序使用数据库。我的意思是写在.env文件中:
QUEUE_DRIVER=database
您知道,如果您使用的是"数据库"而不是" redis"或其他队列驱动程序,则数据库中必须有"作业"表:
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"表( source (,首先您必须运行工匠命令:
php artisan queue:failed-table
此命令将在数据库 Migrations文件夹中创建一个迁移PHP文件
然后,通过运行迁移命令,您可以创建一个Failed_jobs表:
php artisan migrate
处理工作表中的作业表:
php artisan queue:work
排队工人的行为是这样的:
1-如果"作业"表中的作业失败,请将其保存为"失败_jobs"表,然后从"作业"表中删除
2-如果工作成功完成,只需从"工作"表中删除。不要再保存在任何地方,只需删除这项工作即可。
最后,我的问题是:如果队列工作者成功完成了一项工作,那么无论如何都有将此作业记录保存到名为" poolted_jobs"的数据库中的任何表格。
。,因为对我来说,重要的是要说: "邮寄给安德森先生的邮寄由队列工人发送给2018年1月25日15:42:20"
laravel在工作之前,之后和失败的工作发动了工作事件。为了您需要,您可以在事件后注册一个侦听器,并存储成功运行的工作记录。
在服务提供商的引导方法中:
Queue::after(function (JobProcessed $event) {
// $event->connectionName
// $event->job
// $event->job->payload()
});