企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 队列消息 目录 文件 * 在线文档收集 * 路由组 * 控制器 * 问题 * 笔记 * OctoberCms服务 * app容器 * 扩展行为 * 缓存 * Collection类 * Lazy Collections * Collection方法 * 助手函数 * 数组助手函数 * 路径助手函数 * 玄乐助手函数 * 其他助手函数 * 错误与记录 * 事件处理 * HTML页面 * 文件与目录操作 * 散列和加密 * 邮件 * 邮件内容 * 邮件发送 * 分页 * 模板解析器 * 动态解析器语法 * 队列消息 * 请求与输入 * 响应 * 视图 * 路由器 * 配置 * 验证操作 * October CMS * OctoberCms控制器 * 转载 * vscode编辑器 * OctoberCms数据库操作 * corlate模板修改 * 修改顶部导航 新建章节 最后由xhdx\_2005在4 天前编辑 ### 组态  队列允许您将诸如发送电子邮件之类的耗时任务的处理推迟到以后,从而大大加快了对应用程序的Web请求。  队列配置文件存储在中`config/queue.php`。在此文件中,您将找到包含的每个队列驱动程序的连接配置,例如数据库,\[Beanstalkd\](http://kr.github.com/beanstalkd),\[IronMQ\](http://iron.io/),\[Amazon SQS\](http://aws.amazon.com/sqs),\[Redis\](http://redis.io/),空和同步(供本地使用)驱动程序。该`null`队列驾驶员简单地丢弃排队的作业,使他们永远不会执行。  ### 驱动程序先决条件  在使用Amazon SQS,Beanstalkd,IronMQ或Redis驱动程序之前,您需要安装\[Drivers plugin\](http://octobercms.com/plugin/october-drivers)。  ### \[\](https://octobercms.com/docs/services/queues#basic\-usage)基本用法  #### 将作业推入队列  要将新作业推送到队列,请使用以下`Queue::push`方法:  ~~~ Queue::push('SendEmail', \['message' => $message\]); ~~~  给该`push`方法的第一个参数是应用于处理作业的类的名称。第二个参数是应传递给处理程序的数据数组。作业处理程序应如下定义:  ~~~ class SendEmail { public function fire($job, $data) { // } } ~~~  注意,唯一需要的方法是`fire`,它接收一个`Job`实例以及该实例的数组`data`被推送到队列中。  #### 指定自定义处理程序方法  如果您希望作业使用以外的方法`fire`,则可以在推送作业时指定该方法:  ~~~ Queue::push('SendEmail@send', \['message' => $message\]); ~~~  #### 指定作业的队列名称  您还可以指定将作业发送到的队列/管道:  ~~~ Queue::push('SendEmail@send', \['message' => $message\], 'emails'); ~~~  #### 延迟执行工作  有时您可能希望延迟执行排队的作业。例如,您可能希望将注册后15分钟发送电子邮件给客户的作业排队。您可以使用以下`Queue::later`方法完成此操作:  ~~~ $date = Carbon::now()\-\>addMinutes(15);  Queue::later($date, 'SendEmail', \['message' => $message\]); ~~~  在此示例中,我们使用\[Carbon\](https://github.com/briannesbitt/Carbon)日期库指定希望分配给作业的延迟。或者,您可以将希望延迟的秒数作为整数传递。  \> \*\*注意:\*\*Amazon SQS服务的延迟限制为900秒(15分钟)。  #### 队列和模型  如果您排队的作业在其数据中采用了模型,则只有模型的标识符将被序列化到队列中。在实际处理完作业后,队列系统将自动从数据库中重新检索完整的模型实例。所有这些对您的应用程序都是完全透明的,并且可以防止序列化完整模型实例引起的问题。  #### 删除已处理的作业  处理完作业后,必须将其从队列中删除,这可以通过实例上的`delete`方法来完成`Job`:  ~~~ public function fire($job, $data) { // Process the job...  $job->delete(); } ~~~  #### 将作业释放回队列  如果希望将作业释放回队列,则可以通过以下`release`方法进行释放:  ~~~ public function fire($job, $data) { // Process the job...  $job->release(); } ~~~  您还可以指定释放作业之前要等待的秒数:  ~~~ $job\-\>release(5); ~~~  #### 检查运行尝试次数  如果在处理作业时发生异常,它将自动释放回队列。您可以使用以下`attempts`方法检查已尝试运行该作业的次数:  ~~~ if ($job\-\>attempts() > 3) { // } ~~~  #### 访问工作ID  您还可以访问工作标识符:  ~~~ $job\-\>getJobId(); ~~~  ### \[\](https://octobercms.com/docs/services/queues#queueing\-closures)排队关闭  您也可以将Closure推入队列。这对于需要排队的快速,简单任务非常方便:  #### 将闭包推入队列  ~~~ Queue::push(function($job) use ($id) { Account::delete($id);  $job->delete(); }); ~~~  \> \*\*注意:\*\*不要通过`use`指令将对象提供给排队的闭包,而应考虑传递主键并从队列作业中重新拉相关的模型。这通常可以避免意外的序列化行为。  使用Iron.io\[推送队列时\](https://octobercms.com/docs/services/queues#push-queues),应采取额外的预防措施将Closures排队。接收队列消息的端点应检查令牌以验证请求是否确实来自Iron.io。例如,您的推送队列端点应类似于:`https://example.com/queue/receive?token=SecretToken`。然后,您可以在编组队列请求之前检查应用程序中秘密令牌的值。  ### \[\](https://octobercms.com/docs/services/queues#running\-the\-queue\-worker)运行队列工作器  October包含一些\[控制台命令\](https://octobercms.com/docs/console/commands),这些\[命令\](https://octobercms.com/docs/console/commands)将处理队列中的作业。  要在将新作业推入队列时对其进行处理,请运行以下`queue:work`命令:  ~~~ php artisan queue:work ~~~  此任务启动后,它将继续运行,直到手动将其停止为止。您可以使用诸如\[Supervisor之\](https://octobercms.com/docs/services/queues#supervisor-configuration)类的进程监视器来确保队列工作器不会停止运行。  队列工作进程将启动的应用程序状态存储在内存中。启动后,他们将无法识别您的代码更改。部署更改时,请重新启动队列工作器。  #### 处理单个作业  要仅处理队列中的第一个作业,请使用以下`--once`选项:  ~~~ php artisan queue:work \--once ~~~  #### 指定连接和队列  您还可以指定工作者应使用哪个队列连接:  ~~~ php artisan queue:work \--once connection ~~~  您可以将以逗号分隔的队列连接列表传递给`work`命令以设置队列优先级:  ~~~ php artisan queue:work \--once \--queue=high,low ~~~  在此示例中,`high`将始终处理`low`队列中的作业,然后再将其从队列移至作业。  #### 指定作业超时参数  您还可以设置允许每个作业运行的时间长度(以秒为单位):  ~~~ php artisan queue:work \--once \--timeout=60 ~~~  #### 指定队列睡眠时间  另外,您可以指定在轮询新作业之前要等待的秒数:  ~~~ php artisan queue:work \--once \--sleep=5 ~~~  请注意,如果队列中没有作业,则队列仅“休眠”。如果有更多的作业可用,队列将继续工作而不休眠。  ### \[\](https://octobercms.com/docs/services/queues#daemon\-queue\-worker)守护程序队列工作者  默认情况下,`queue:work`将处理作业,而无需重新启动框架。与该`queue:work --once`命令相比,这可显着减少CPU使用率,但会增加部署期间需要清空当前正在执行的作业队列的复杂性。  要以守护程序模式启动队列工作器,只需省略该`--once`标志:  ~~~ php artisan queue:work connection  php artisan queue:work connection \--sleep=3  php artisan queue:work connection \--sleep=3 \--tries=3 ~~~  您可以使用该`php artisan help queue:work`命令查看所有可用选项。  ### 使用守护程序队列工作器进行部署  使用守护程序队列工作器部署应用程序的最简单方法是在部署开始时将应用程序置于维护模式。可以使用后端设置区域完成此操作。一旦应用程序处于维护模式,十月将不接受队列中的任何新作业,但将继续处理现有作业。  重新启动工作程序的最简单方法是在部署脚本中包括以下命令:  ~~~ php artisan queue:restart ~~~  此命令将指示所有队列工作器在处理完当前作业后重新启动。  \> \*\*注意:\*\*此命令依赖于高速缓存系统来计划重新启动。默认情况下,APCu不适用于CLI命令。如果您使用的是APCu,请添加`apc.enable\_cli=1`到您的APCu配置中。  ### 守护程序队列工作者的编码  守护程序队列工作程序在处理每个作业之前不会重新启动平台。因此,在工作完成之前,您应小心释放任何大量资源。例如,如果要使用GD库进行图像处理,`imagedestroy`则完成后应释放内存。  同样,长时间运行的守护程序使用数据库连接时可能会断开连接。您可以使用该`Db::reconnect`方法来确保您具有全新的连接。  ### \[\](https://octobercms.com/docs/services/queues#supervisor\-configuration)主管配置  ### 安装主管  Supervisor是Linux操作系统的进程监视器,`queue:work`如果进程失败,它将自动重启。要在Ubuntu上安装Supervisor,可以使用以下命令:  ~~~ sudo apt\-get install supervisor ~~~  ### 配置主管  主管配置文件通常存储在`/etc/supervisor/conf.d`目录中。在此目录中,您可以创建任意数量的配置文件,这些文件指导主管如何监视您的过程。例如,让我们创建一个`october-worker.conf`启动并监视`queue:work`过程的文件:  ~~~ \[program:october\-worker\] process\_name=%(program\_name)s\_%(process\_num)02d command=php /path/to/october/artisan queue:work \--sleep=3 \--tries=3 autostart=true autorestart=true user=october numprocs=8 redirect\_stderr=true stdout\_logfile=/path/to/october/worker.log ~~~  在此示例中,`numprocs`指令将指示Supervisor运行8个`queue:work`进程并监视所有进程,如果它们失败则自动将其重新启动。当然,您应该更改`queue:work`命令指令的部分以反映所需的队列连接。该`user`指令应更改为有权运行该命令的用户的名称。  ### 起始主管  创建配置文件后,您可以使用以下命令更新Supervisor配置并启动过程:  ~~~ sudo supervisorctl reread  sudo supervisorctl update  sudo supervisorctl start october\-worker:\* ~~~  有关Supervisor的更多信息,请参阅\[Supervisor文档\](http://supervisord.org/index.html)。  ### \[\](https://octobercms.com/docs/services/queues#failed\-jobs)失败的工作  由于事情并非总是按计划进行,因此有时排队的工作将失败。别担心,这发生在我们当中!有一种方便的方法可以指定尝试作业的最大次数。作业超过此尝试次数后,它将被插入`failed\_jobs`表中。可以通过`config/queue.php`配置文件配置失败的作业表名称。  您可以使用`--tries`以下`queue:work`命令上的开关指定尝试作业的最大次数:  ~~~ php artisan queue:work connection\-name \--tries=3 ~~~  如果您想要注册将在队列作业失败时调用的事件,则可以使用该`Queue::failing`方法。此事件是通过电子邮件或其他第三方服务通知您的团队的好机会。  ~~~ Queue::failing(function($connection, $job, $data) { // }); ~~~  您还可以`failed`直接在队列作业类上定义方法,从而使您可以在发生故障时执行特定于作业的操作:  ~~~ public function failed($data) { // Called when the job is failing... } ~~~  的原始数组`data`也将自动传递给失败的方法。  ### 重试失败的作业  要查看所有失败的作业,可以使用`queue:failed`Artisan命令:  ~~~ php artisan queue:failed ~~~  该`queue:failed`命令将列出作业ID,连接,队列和故障时间。作业ID可用于重试失败的作业。例如,要重试ID为5的失败作业,应发出以下命令:  ~~~ php artisan queue:retry 5 ~~~  如果要删除失败的作业,可以使用以下`queue:forget`命令:  ~~~ php artisan queue:forget 5 ~~~  要删除所有失败的作业,可以使用以下`queue:flush`命令:  ~~~ php artisan queue:flush ~~~   ### 组态 队列允许您将诸如发送电子邮件之类的耗时任务的处理推迟到以后,从而大大加快了对应用程序的Web请求。 队列配置文件存储在中`config/queue.php`。在此文件中,您将找到包含的每个队列驱动程序的连接配置,例如数据库,[Beanstalkd](http://kr.github.com/beanstalkd),[IronMQ](http://iron.io/),[Amazon SQS](http://aws.amazon.com/sqs),[Redis](http://redis.io/),空和同步(供本地使用)驱动程序。该`null`队列驾驶员简单地丢弃排队的作业,使他们永远不会执行。 ### 驱动程序先决条件 在使用Amazon SQS,Beanstalkd,IronMQ或Redis驱动程序之前,您需要安装[Drivers plugin](http://octobercms.com/plugin/october-drivers)。 ### [](https://octobercms.com/docs/services/queues#basic-usage)基本用法 #### 将作业推入队列 要将新作业推送到队列,请使用以下`Queue::push`方法: ~~~ Queue::push('SendEmail', ['message' => $message]); ~~~ 给该`push`方法的第一个参数是应用于处理作业的类的名称。第二个参数是应传递给处理程序的数据数组。作业处理程序应如下定义: ~~~ class SendEmail { public function fire($job, $data) { // } } ~~~ 注意,唯一需要的方法是`fire`,它接收一个`Job`实例以及该实例的数组`data`被推送到队列中。 #### 指定自定义处理程序方法 如果您希望作业使用以外的方法`fire`,则可以在推送作业时指定该方法: ~~~ Queue::push('SendEmail@send', ['message' => $message]); ~~~ #### 指定作业的队列名称 您还可以指定将作业发送到的队列/管道: ~~~ Queue::push('SendEmail@send', ['message' => $message], 'emails'); ~~~ #### 延迟执行工作 有时您可能希望延迟执行排队的作业。例如,您可能希望将注册后15分钟发送电子邮件给客户的作业排队。您可以使用以下`Queue::later`方法完成此操作: ~~~ $date = Carbon::now()->addMinutes(15); Queue::later($date, 'SendEmail', ['message' => $message]); ~~~ 在此示例中,我们使用[Carbon](https://github.com/briannesbitt/Carbon)日期库指定希望分配给作业的延迟。或者,您可以将希望延迟的秒数作为整数传递。 > \*\*注意:\*\*Amazon SQS服务的延迟限制为900秒(15分钟)。 #### 队列和模型 如果您排队的作业在其数据中采用了模型,则只有模型的标识符将被序列化到队列中。在实际处理完作业后,队列系统将自动从数据库中重新检索完整的模型实例。所有这些对您的应用程序都是完全透明的,并且可以防止序列化完整模型实例引起的问题。 #### 删除已处理的作业 处理完作业后,必须将其从队列中删除,这可以通过实例上的`delete`方法来完成`Job`: ~~~ public function fire($job, $data) { // Process the job... $job->delete(); } ~~~ #### 将作业释放回队列 如果希望将作业释放回队列,则可以通过以下`release`方法进行释放: ~~~ public function fire($job, $data) { // Process the job... $job->release(); } ~~~ 您还可以指定释放作业之前要等待的秒数: ~~~ $job->release(5); ~~~ #### 检查运行尝试次数 如果在处理作业时发生异常,它将自动释放回队列。您可以使用以下`attempts`方法检查已尝试运行该作业的次数: ~~~ if ($job->attempts() > 3) { // } ~~~ #### 访问工作ID 您还可以访问工作标识符: ~~~ $job->getJobId(); ~~~ ### [](https://octobercms.com/docs/services/queues#queueing-closures)排队关闭 您也可以将Closure推入队列。这对于需要排队的快速,简单任务非常方便: #### 将闭包推入队列 ~~~ Queue::push(function($job) use ($id) { Account::delete($id); $job->delete(); }); ~~~ > \*\*注意:\*\*不要通过`use`指令将对象提供给排队的闭包,而应考虑传递主键并从队列作业中重新拉相关的模型。这通常可以避免意外的序列化行为。 [使用Iron.io](http://xn--iron-9s6fu80r.io/)[推送队列时](https://octobercms.com/docs/services/queues#push-queues),应采取额外的预防措施将Closures排队。[接收队列消息的端点应检查令牌以验证请求是否确实来自Iron.io](http://xn--iron-455fg838csuex3vq4gjof1rl7if01d66fm9bm5f6uv1vf5qs6yhy4yk8ji7o2q6bcq5cxgbv15oe30a.io/)。例如,您的推送队列端点应类似于:`https://example.com/queue/receive?token=SecretToken`。然后,您可以在编组队列请求之前检查应用程序中秘密令牌的值。 ### [](https://octobercms.com/docs/services/queues#running-the-queue-worker)运行队列工作器 October包含一些[控制台命令](https://octobercms.com/docs/console/commands),这些[命令](https://octobercms.com/docs/console/commands)将处理队列中的作业。 要在将新作业推入队列时对其进行处理,请运行以下`queue:work`命令: ~~~ php artisan queue:work ~~~ 此任务启动后,它将继续运行,直到手动将其停止为止。您可以使用诸如[Supervisor之](https://octobercms.com/docs/services/queues#supervisor-configuration)类的进程监视器来确保队列工作器不会停止运行。 队列工作进程将启动的应用程序状态存储在内存中。启动后,他们将无法识别您的代码更改。部署更改时,请重新启动队列工作器。 #### 处理单个作业 要仅处理队列中的第一个作业,请使用以下`--once`选项: ~~~ php artisan queue:work --once ~~~ #### 指定连接和队列 您还可以指定工作者应使用哪个队列连接: ~~~ php artisan queue:work --once connection ~~~ 您可以将以逗号分隔的队列连接列表传递给`work`命令以设置队列优先级: ~~~ php artisan queue:work --once --queue=high,low ~~~ 在此示例中,`high`将始终处理`low`队列中的作业,然后再将其从队列移至作业。 #### 指定作业超时参数 您还可以设置允许每个作业运行的时间长度(以秒为单位): ~~~ php artisan queue:work --once --timeout=60 ~~~ #### 指定队列睡眠时间 另外,您可以指定在轮询新作业之前要等待的秒数: ~~~ php artisan queue:work --once --sleep=5 ~~~ 请注意,如果队列中没有作业,则队列仅“休眠”。如果有更多的作业可用,队列将继续工作而不休眠。 ### [](https://octobercms.com/docs/services/queues#daemon-queue-worker)守护程序队列工作者 默认情况下,`queue:work`将处理作业,而无需重新启动框架。与该`queue:work --once`命令相比,这可显着减少CPU使用率,但会增加部署期间需要清空当前正在执行的作业队列的复杂性。 要以守护程序模式启动队列工作器,只需省略该`--once`标志: ~~~ php artisan queue:work connection php artisan queue:work connection --sleep=3 php artisan queue:work connection --sleep=3 --tries=3 ~~~ 您可以使用该`php artisan help queue:work`命令查看所有可用选项。 ### 使用守护程序队列工作器进行部署 使用守护程序队列工作器部署应用程序的最简单方法是在部署开始时将应用程序置于维护模式。可以使用后端设置区域完成此操作。一旦应用程序处于维护模式,十月将不接受队列中的任何新作业,但将继续处理现有作业。 重新启动工作程序的最简单方法是在部署脚本中包括以下命令: ~~~ php artisan queue:restart ~~~ 此命令将指示所有队列工作器在处理完当前作业后重新启动。 > \*\*注意:\*\*此命令依赖于高速缓存系统来计划重新启动。默认情况下,APCu不适用于CLI命令。如果您使用的是APCu,请添加`apc.enable_cli=1`到您的APCu配置中。 ### 守护程序队列工作者的编码 守护程序队列工作程序在处理每个作业之前不会重新启动平台。因此,在工作完成之前,您应小心释放任何大量资源。例如,如果要使用GD库进行图像处理,`imagedestroy`则完成后应释放内存。 同样,长时间运行的守护程序使用数据库连接时可能会断开连接。您可以使用该`Db::reconnect`方法来确保您具有全新的连接。 ### [](https://octobercms.com/docs/services/queues#supervisor-configuration)主管配置 ### 安装主管 Supervisor是Linux操作系统的进程监视器,`queue:work`如果进程失败,它将自动重启。要在Ubuntu上安装Supervisor,可以使用以下命令: ~~~ sudo apt-get install supervisor ~~~ ### 配置主管 主管配置文件通常存储在`/etc/supervisor/conf.d`目录中。在此目录中,您可以创建任意数量的配置文件,这些文件指导主管如何监视您的过程。例如,让我们创建一个`october-worker.conf`启动并监视`queue:work`过程的文件: ~~~ [program:october-worker] process_name=%(program_name)s_%(process_num)02d command=php /path/to/october/artisan queue:work --sleep=3 --tries=3 autostart=true autorestart=true user=october numprocs=8 redirect_stderr=true stdout_logfile=/path/to/october/worker.log ~~~ 在此示例中,`numprocs`指令将指示Supervisor运行8个`queue:work`进程并监视所有进程,如果它们失败则自动将其重新启动。当然,您应该更改`queue:work`命令指令的部分以反映所需的队列连接。该`user`指令应更改为有权运行该命令的用户的名称。 ### 起始主管 创建配置文件后,您可以使用以下命令更新Supervisor配置并启动过程: ~~~ sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start october-worker:* ~~~ 有关Supervisor的更多信息,请参阅[Supervisor文档](http://supervisord.org/index.html)。 ### [](https://octobercms.com/docs/services/queues#failed-jobs)失败的工作 由于事情并非总是按计划进行,因此有时排队的工作将失败。别担心,这发生在我们当中!有一种方便的方法可以指定尝试作业的最大次数。作业超过此尝试次数后,它将被插入`failed_jobs`表中。可以通过`config/queue.php`配置文件配置失败的作业表名称。 您可以使用`--tries`以下`queue:work`命令上的开关指定尝试作业的最大次数: ~~~ php artisan queue:work connection-name --tries=3 ~~~ 如果您想要注册将在队列作业失败时调用的事件,则可以使用该`Queue::failing`方法。此事件是通过电子邮件或其他第三方服务通知您的团队的好机会。 ~~~ Queue::failing(function($connection, $job, $data) { // }); ~~~ 您还可以`failed`直接在队列作业类上定义方法,从而使您可以在发生故障时执行特定于作业的操作: ~~~ public function failed($data) { // Called when the job is failing... } ~~~ 的原始数组`data`也将自动传递给失败的方法。 ### 重试失败的作业 要查看所有失败的作业,可以使用`queue:failed`Artisan命令: ~~~ php artisan queue:failed ~~~ 该`queue:failed`命令将列出作业ID,连接,队列和故障时间。作业ID可用于重试失败的作业。例如,要重试ID为5的失败作业,应发出以下命令: ~~~ php artisan queue:retry 5 ~~~ 如果要删除失败的作业,可以使用以下`queue:forget`命令: ~~~ php artisan queue:forget 5 ~~~ 要删除所有失败的作业,可以使用以下`queue:flush`命令: ~~~ php artisan queue:flush ~~~