”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Laravel 中创建计划任务?

如何在 Laravel 中创建计划任务?

发布于2024-11-03
浏览:282

大家好!今天,我将引导您完成在 Laravel 中创建计划任务的过程。我们将以向用户发送每日营销电子邮件为例。

第 1 步:创建电子邮件类

首先,让我们使用以下 Artisan 命令创建一个新的 Mailable 类:

php artisan make:mail DailyMarketingEmail --view

此命令在 App/Mail 目录中生成一个新的 Mailable 类,并在 resources/views/mail/ 目录中生成相应的视图文件 daily-marketing-email.blade.php。您可以在此视图文件中自定义电子邮件的内容。

第 2 步:创建 Artisan 命令

接下来,我们将创建一个 Artisan 命令来处理发送 DailyMarketingEmail。运行以下命令:

php artisan make:command SendDailyMarketingEmail

该命令会在app/Console/Commands目录下生成一个新的命令类。

第 3 步:了解命令结构

生成命令后,您将在生成的类中看到两个关键属性:

protected $signature:这定义了 Artisan 命令的名称和签名。
protected $description:这提供了命令的描述。
此类中的句柄方法是您定义命令逻辑的地方。

一切设置完毕后,您可以通过运行以下命令列出所有 Artisan 命令:

php 工匠

您应该在列表中看到您的命令:

How to create a scheduled Task in Laravel ?

第 4 步:实现命令逻辑

现在,让我们在handle方法中定义发送营销电子邮件的逻辑:

each(function ($user) {
            Mail::to($user->email)->send(new DailyMarketingEmail);
        });

    }
}

在handle方法中,我们从数据库中检索所有用户并向每个用户发送DailyMarketingEmail。

第 5 步:测试命令

您可以通过运行手动测试您的命令:

php artisan app:send-daily-marketing-emails

考虑使用 Mailtrap 或 MailHog 等工具在测试期间捕获和查看已发送的电子邮件。

第 6 步:安排命令

最后,为了每天自动发送这封电子邮件,我们需要在位于 app/Console/ 目录的 Kernel.php 文件的 Schedule 方法中安排命令:

command('app:send-daily-marketing-emails')->dailyAt('08:30'); 
    }

    /**
     * Register the commands for the application.
     */
    protected function commands(): void
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

在这里,我们使用 dailyAt('08:30') 方法安排命令在每天上午 08:30 运行。您可以根据需要调整时间。

附加建议:

  1. 排队电子邮件:对于大量用户来说,将电子邮件排队而不是一次性发送所有电子邮件是一个很好的做法。这可以通过在 Mailable 类中实现 ShouldQueue 接口来完成。

  2. 性能注意事项:对于大型用户群,请考虑优化数据库查询和电子邮件发送过程,以确保高效的性能。

版本声明 本文转载于:https://dev.to/kepsondiaz/how-to-create-a-scheduled-task-in-laravel--54a0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Firestore 如何优化社交网络时间线以实现可扩展性?
    Firestore 如何优化社交网络时间线以实现可扩展性?
    使用 Firestore 优化社交网络时间线在设计具有提要和关注功能的社交网络时,数据库可扩展性对于处理潜在问题至关重要大型数据集。 Firebase 的实时数据库带来了可扩展性挑战,特别是在存储用户时间线的方法方面。要解决这些问题,请考虑过渡到 Firestore。优化的数据库结构Firestor...
    编程 发布于2024-11-08
  • 如何解决将对象数组作为函数参数传递时的错误?
    如何解决将对象数组作为函数参数传递时的错误?
    类型提示:对象数组将对象数组作为参数传递给函数时,如果未指定参数类型。例如,考虑以下代码:class Foo {} function getFoo(Foo $f) {}尝试将 Foo 对象数组传递给 getFoo 将导致致命错误:Argument 1 passed to getFoo() must ...
    编程 发布于2024-11-08
  • 为什么 iOS 设备上缺少 CSS 滚动条?
    为什么 iOS 设备上缺少 CSS 滚动条?
    iOS上无法显示带有CSS Overflow的滚动条为iPad开发网站时,使用CSS属性overflow: auto来启用div 内的滚动条可能无效。尽管两指滚动手势功能正常,但滚动条仍然隐藏。尝试同时使用溢出:自动和溢出:滚动不会产生任何结果。iOS行为不幸的是,溢出:自动和滚动都不会在iOS设备...
    编程 发布于2024-11-08
  • Java中如何从线程操作返回值?
    Java中如何从线程操作返回值?
    线程操作返回值在多线程编程中,线程之间的交互往往需要交换数据。一种常见的情况是尝试检索在单独线程中执行的操作的结果。请考虑下面的示例代码:public void test() { Thread uiThread = new HandlerThread("UIHandler"...
    编程 发布于2024-11-08
  • Python 简介:)
    Python 简介:)
    历史 Python 由 Guido van Rossum 创建,首次发布于 1991 年。它旨在优先考虑代码的可读性和简单性,从而提高开发人员的工作效率。 “Python” 的灵感来自 BBC 电视节目 “Monty Python's Flying Circus”,van ...
    编程 发布于2024-11-08
  • 学习 Go 结构最终如何让我爱上编码
    学习 Go 结构最终如何让我爱上编码
    “我仍然记得早期与代码搏斗的日子。 基本的东西?我正要到那里。但后来出现了结构体,一切都变得模糊起来。我不断地破坏东西,我的代码一团糟。我做错了什么? 直到我坐下来,学习了 Go 结构体的基础知识,并开始有效地使用它们,事情才终于有了进展。那是转折点。突然间,代码变得更有组织、更高效、更干净。它改变...
    编程 发布于2024-11-08
  • MERN 堆栈仍然有效吗?
    MERN 堆栈仍然有效吗?
    Remember when the MERN stack was the Beyoncé of web development stacks? It was everywhere, and if you weren’t using it, you were probably missing out ...
    编程 发布于2024-11-08
  • 什么时候需要在 Tkinter 中调用 `mainloop()`?
    什么时候需要在 Tkinter 中调用 `mainloop()`?
    在 Tkinter 应用程序中调用 mainloop在 Tkinter 中,mainloop 是实现窗口渲染和事件处理的基本功能。与流行的看法相反,并不总是需要在交互式 shell 环境中显式调用 mainloop。然而,这种便利在 shell 之外并不适用。mainloop 的作用mainloop...
    编程 发布于2024-11-08
  • 如何解决将静态 C 库与 C++ 代码链接时出现“未定义的引用”错误?
    如何解决将静态 C 库与 C++ 代码链接时出现“未定义的引用”错误?
    对用 C 代码链接静态 C 库时的错误的未定义引用当尝试用 C 代码链接静态 C 库时,您可以尽管修改了链接顺序,但仍遇到“未定义的引用”错误。此问题是由 C 和 C 编译创建的不同符号名称(称为“名称修饰”)引起的。在 C 中,链接器在错误消息中显示分解的符号名称,这可能会造成混淆。使用“nm -...
    编程 发布于2024-11-08
  • 书籍:学习 JavaScript 设计模式
    书籍:学习 JavaScript 设计模式
    本书探讨了 JavaScript 中常见软件设计模式的实现和使用。虽然根据最新的最佳实践,一些示例可能稍微过时,但它们对于维护遗留系统的人来说仍然很有价值。 对于初学者: 它是对软件设计模式的出色介绍。然而,对于那些编程经验有限的人来说,这些模式解决的问题可能不太熟悉。 ...
    编程 发布于2024-11-08
  • 如何在JavaScript中进行稳定排序以保持元素顺序的一致性?
    如何在JavaScript中进行稳定排序以保持元素顺序的一致性?
    JavaScript 中的稳定排序算法对数据进行排序时,保留相等元素的原始顺序对于稳定的排序算法至关重要。在这种情况下,我们的目标是按给定顺序对具有特定键的对象数组进行排序,同时保持元素顺序一致性。稳定排序技术有趣的是,甚至非稳定排序函数可以实现稳定排序。通过在排序前捕获每个元素的初始位置,我们可以...
    编程 发布于2024-11-08
  • npm 与 npx
    npm 与 npx
    如果您一直在使用 Node.js,您可能遇到过 npm 和 npx。 虽然它们听起来很相似并且都是 Node.js 生态系统不可或缺的一部分,但它们有不同的用途。这篇文章将探讨 npm 和 npx 之间的差异,帮助您了解何时以及为何使用它们。 什么是NPM? NPM 是 Node ...
    编程 发布于2024-11-08
  • Python 中的链式赋值如何工作?它们真的相当于多个顺序分配吗?
    Python 中的链式赋值如何工作?它们真的相当于多个顺序分配吗?
    理解 Python 中的链式赋值Python 中的链式赋值,例如“x = y = somefunction()”这样的表达式,引发了人们的关注关于它们与多个顺序赋值的等价性的讨论(“x = somefunction(); y = somefunction()”)。为了澄清这个问题,让我们详细探讨一下...
    编程 发布于2024-11-08
  • 如何使用 Gorilla Websocket 在 Go Websocket 应用程序中向特定客户端发送目标消息?
    如何使用 Gorilla Websocket 在 Go Websocket 应用程序中向特定客户端发送目标消息?
    Go with Gorilla Websocket 中的特定客户端消息传递在 websocket 通信领域,向特定客户端发送消息的能力对于构建实时应用程序至关重要。然而,默认的 websocket 示例通常演示同时向所有连接的客户端广播消息。为了解决这个问题,我们可以采用一种方法,为每个客户端分配一...
    编程 发布于2024-11-08
  • O - 开闭原理 (OCP)
    O - 开闭原理 (OCP)
    What is Open/Closed Principle(OCP)? According to the Open/Closed Principle, "Objects or entities (such as classes, modules, functions, etc.) ...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3