Laravel 5.4 是否已完成记录作业的解决方案?

And*_*der 5 php queue laravel laravel-5 laravel-5.4

我在我的项目中使用 Laravel 5.4 和 MySQL。

远程服务器是 PHP Server 7

当用户将记录保存到数据库时,它也会创建一个队列作业来通知相关公司官员。我的代码在控制器文件中

    foreach($audit->mailusers AS $mailuser){
        $this->dispatch(new SendAuditEmail($audit->id, $mailuser->name, $mailuser->email));
    }
Run Code Online (Sandbox Code Playgroud)

我正在为 QUEUE DRIVER 使用数据库。我的意思是它写在 .env 文件中,如下所示:

QUEUE_DRIVER=database
Run Code Online (Sandbox Code Playgroud)

如您所知,如果您使用“数据库”而不是“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;
Run Code Online (Sandbox Code Playgroud)

同样如您所知,如果您想处理失败的作业,您的数据库中应该多一个名为“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;
Run Code Online (Sandbox Code Playgroud)

要创建“failed_jobs”表(source),首先您必须运行 artisan 命令:

php artisan queue:failed-table
Run Code Online (Sandbox Code Playgroud)

此命令将在 database\migrations 文件夹中创建一个迁移 php 文件

然后通过运行 migrate 命令,您可以创建一个 failed_jobs 表:

php artisan migrate
Run Code Online (Sandbox Code Playgroud)

要处理作业表中的作业:

php artisan queue:work
Run Code Online (Sandbox Code Playgroud)

队列工作者的行为是这样的:

1- 如果“jobs”表中的作业失败,则将其保存到“failed_jobs”表并从“jobs”表中删除

2- 如果作业成功完成,只需从“作业”表中删除。不要在任何地方再次保存它,只需删除此作业。

最后,我的问题是:如果队列工作人员成功完成了一项工作,是否可以将此工作记录保存到数据库中名为“已完成_jobs”的任何其他表中。

因为,对我来说,能够这样说很重要: “队列工作人员在 25.01.2018 15:42:20 发送给安德森先生的邮件”

小智 3

Laravel 会针对之前、之后和失败的作业触发作业事件。根据您的需要,您可以注册事件后监听器并存储已成功运行的作业的记录。

在服务提供商的启动方法中:

   Queue::after(function (JobProcessed $event) {
        // $event->connectionName
        // $event->job
        // $event->job->payload()
    });
Run Code Online (Sandbox Code Playgroud)