创建和分发任务
使用 Artisan 生成任务类,并从控制器中分发任务。
创建和分发任务 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
什么是任务?
任务是封装单个队列工作单元的 PHP 类。每个任务都会实现 handle(),队列工作进程会调用它来执行任务。
生成任务
使用 Artisan 创建任务类。--queue 标志会使其加入队列(默认行为)。
$ php artisan make:job SendWelcomeEmail任务类结构
任务包含一个 handle() 方法,并可以通过其构造方法接收数据。
<?php
namespace App\Jobs;
use App\Models\User;
use App\Mail\WelcomeEmail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\SerializesModels;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, Queueable, SerializesModels;
public function __construct(private User $user) {}
public function handle(): void
{
Mail::to($this->user)->send(new WelcomeEmail($this->user));
}
}分发任务
您可以从应用中的任何位置分发任务。
<?php
// Dispatch to queue:
SendWelcomeEmail::dispatch($user);
// Dispatch with delay:
SendWelcomeEmail::dispatch($user)->delay(now()->addMinutes(10));
// Dispatch synchronously (bypass queue):
SendWelcomeEmail::dispatchSync($user);任务分发辅助方法
您也可以使用全局辅助方法 dispatch()。
<?php
dispatch(new SendWelcomeEmail($user))
->onQueue("emails")
->delay(now()->addHour());onQueue()
分发任务时,将其指定到特定的命名队列。
<?php
SendWelcomeEmail::dispatch($user)->onQueue("emails");onConnection()
将任务指定到特定的队列连接(例如,一个任务使用 SQS,另一个任务使用 Redis)。
<?php
SendWelcomeEmail::dispatch($user)->onConnection("sqs");序列化模型
SerializesModels trait 可确保传递给任务的 Eloquent 模型按 ID 序列化,并由工作进程从数据库中重新获取,从而避免使用过时数据。
afterResponse()
在 HTTP 响应发送给用户后分发任务,用户无需等待分发开销。
<?php
App::terminating(fn () => SendWelcomeEmail::dispatch($user));测试任务
在测试中使用 Queue::fake(),即可断言任务已被分发,而无需实际运行任务。
<?php
Queue::fake();
$this->post("/register", $data);
Queue::assertPushed(SendWelcomeEmail::class);唯一任务
实现 ShouldBeUnique,以防止相同数据的重复任务在队列中不断堆积。
总结
使用 Artisan 生成任务。实现 ShouldQueue 和 handle()。使用 ::dispatch() 分发任务。使用 onQueue() 指定队列。使用 Queue::fake() 进行测试。
快速检查
哪个接口会使任务类可以加入队列?
常见问题解答
「创建和分发任务」课时是免费的吗?
是的 — 「创建和分发任务」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「创建和分发任务」这节课中我会学到什么?
使用 Artisan 生成任务类,并从控制器中分发任务。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「创建和分发任务」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。