注意,这篇教程仅适用于 Linux 和 OS X 的系统,Windows 并不适用。

理解 Worker 的本质

技术上讲一个 Worker 就是一个不断运行的PHP进程,并且不断监视新的任务并运行。

一个简单的 Worker 的代码如下:

while (true) {

$jobs = pullData(); // 从队列中拉取任务

foreach ($jobs as $class => $args) { // 循环每个找到的任务

$job = new $class();

$job->perform($args); // 执行任务

}

sleep(300); // 等待5分钟后再次尝试拉取任务

}

以上这些代码的具体实现都可以交给 php-resque。创建一个 Worker,php-resque 需要以下参数:

QUEUE: 需要执行的队列的名字

INTERVAL:在队列中循环的间隔时间,即完成一个任务后的等待时间,默认是5秒

APP_INCLUDE:需要自动载入 PHP 文件路径,Worker 需要知道你的 Job 的位置并载入 Job

COUNT:需要创建的 Worker 的数量。所有的 Worker 都具有相同的属性。默认是创建1个Worker

REDIS_BACKEND:Redis 服务器的地址,使用 hostname:port 的格式,如 127.0.0.1:6379,或 localhost:6379。默认是 localhost:6379

REDIS_BACKEND_DB:使用的 Redis 数据库的名称,默认是 0

VERBOSE:啰嗦模式,设置 1 为启用,会输出基本的调试信息

VVERBOSE:设置“1”启用更啰嗦模式,会输出详细的调试信息

PREFIX:前缀。在 Redis 数据库中为队列的 KEY 添加前缀,以方便多个 Worker 运行在同一个Redis 数据库中方便区分。默认为空

PIDFILE:手动指定 PID 文件的位置,适用于单 Worker 运行方式

以上参数中只有QUEUE是必须的。如果让 Worker 监视执行多个队列,可以用逗号隔开多个队列的名称,如:queue1,queue2,queue3,队列执行是有顺序的,如上 queue2 和 queue3 总是会在 queue1 后面被执行。

也可以设置QUEUE为*让 Worker 以字母顺序执行所有的队列。

Worker 必须以CLI方式启动。你不可以从浏览器启动 Worker,因为:

你无法从浏览器执行后台任务

PCNTL 扩展只能运行在 CLI 模式

启动Worker

可以从resque.php启动 Worker,这个位置位于 php-resque/bin 目录下(也可能不带.php后缀)。

在终端中执行:

cd /path/to/php-resque/bin/

php resque.php

很显然 Worker 不会被启动,因为缺少必须的参数 QUEUE,程序将会返回如下错误:

Set QUEUE env var containing the list of queues to work.

php-resque 通过getenv获取参数,所以在启动 Worker 的时候应该传递环境变量过去。所以应该以下面的方式启动 Worker:

QUEUE=notification php resque.php

如果启用VVERBOSE模式:

QUEUE=notification VVERBOSE=1 php resque.php

终端将会输出:

*** Starting worker KAMISAMA-MAC.local:84499:notification

** [23:48:18 2012-10-11] Registered signals

** [23:48:18 2012-10-11] Checking achievement

** [23:48:18 2012-10-11] Checking notification

** [23:48:18 2012-10-11] Sleeping for 5

** [23:48:23 2012-10-11] Checking achievement

** [23:48:23 2012-10-11] Checking notification

** [23:48:23 2012-10-11] Sleeping for 5

... etc ...

Worker 会自动被命名为KAMISAMA-MAC.local:84499:notification,命名的规则是hostname:process-id:queue-names。

如果觉得这种启动方式太麻烦且难记,可以自己手动写一个 bash 脚本来帮助你启动 Resque,如:

EXPORT QUEUE=notifacation

EXPORT VERBOSE=1

php resque.php

后台运行Worker

通过上面的方法成功启动了 Worker,但只有在终端开启的状态下,关闭终端或按下 Ctrl+C 时 Worker 就会停止运行。我们可以在命令后面添加一个 & 来使其后台运行。

QUEUE=notification php resque.php &

这样就可以让 resque 在后台运行。但如果你开启了 VERBOSE 模式,所有的输出信息将会丢失。所以我们需要在 resque 后台运行时把输出的信息保存起来。

我们可以使用 nohup 来保持 resque 后台运行,即使是在用户登出后。

nohup QUEUE=notification php resque.php &

当然,如果安装了 node 和 pm2 也可以使用 pm2 启动来保证 resque 后台的运行。

记录下 Worker 的输出

可以使用管道操作的方式重定向输出到文件:

nohup QUEUE=notification php resque.php >> /path/to/your/logfile.log 2>&1 &

这样一来所有的标准及错误输出都会被写入到 logfile.log 文件中。如果需要监视这个文件的内容:

tail -f /path/to/your/logfile.log

Worker 的执行权限

无论何时你在终端中执行命令都是以当前登录用户的权限来执行。如果你登录的 jerry 的账户,php-resque将会运行于 jerry 的权限下。以 root 用户登录时也一样。

如果需要避开当前登录账户以其它用户的权限运行,如 Apache 通常运行在 www-data 用户下,让 php-resque 运行于 www-data 账户:

nohup sudo -u www-data QUEUE=notification php resque.php >> /path/to/your/logfile.log 2>&1 &

操作执行权限时需要注意:

通过 Worker 生成的文件无法被其它用户的php代码读取

Worker 没有权限创建或编辑其它用户的文件

Let's play

前面已经讲了如何启动、如何后台运行、以及记录运行日志,下面就用一些例子结束本节的内容。

创建一个执行 default 队列的 Worker,并且每隔 10 秒检索一次任务:

INTERVAL=10 QUEUE=default php resque.php

创建5个执行 default 队列的 Worker,每隔 5 秒检索一次任务:

QUEUE=default COUNT=5 php resque.php

INTERVAL 参数没有被指定,因为默认值是 5 秒。

创建一个执行 achievement 和 notification 队列的 Worker(需要注意队列名的顺序):

QUEUE=achievement,notification php resque.php

创建一个执行所有队列的 Worker:

QUEUE=* php resque.php

如果你的 Redis 服务器在别的地址:

QUEUE=default REDIS_BACKENT=192.168.1.56:6380 php resque.php

使用自动载入 php 文件:

QUEUE=default APP_INCLUDE=/path/to/autoloader.php php resque.php

确认你的 Worker 成功运行了

通过管道操作无法知道 Worker 是否成功启动,当前通过查看log文件中有没有输出 *** Starting worker ..... 的内容也可以知道是否启动。

也可以通过查看系统进程的方法确认 Worker 是否正在运行。

ps -ef|grep resque.php

将会输出名称中包含resque.php的进程,其中第二列是进程的 PID。

使用这个方法可以很好的知道 Worker 是否正在运行,以及有没有意外终止。

暂停和停止 Worker

要停止一个Worker,直接 kill 掉它的进程就行了。可以通过 ps -ef|grep resque.php 查看 Worker进程的 PID。当然通过这个命令你无法知道哪个 PID 代码的哪个 Worker。

如果要结束一个 PID 是 86681 的进程:

kill 86681

这个命令将会立即结束掉 PID 为 86681 的进程及子进程。如果 Worker 正在执行一个任务也不会等待任务执行完成(未完成的部分将会丢失)。

有一个可以平滑的停止 Worker 的方法,可以通过给 kill 命令发送一个 SIGSPEC 信号来告诉 kill 应该怎么做,这需要 PCNTL 扩展的支持。

当然下面所讲述的所有命令都需要 PCNTL 扩展支持。

通过 PCNTL 扩展,Worker 可以支持以下信号:

QUIT - 等待子进程结束后再结束

TERM / INT - 立即结束子进程并退出

USR1 - 立即结束子进程,但不退出

USR2 - 暂停Worker,不会再执行新任务

CONT - 继续运行Worker

当没有信号发出时默认是 TERM / INT 信号。

如果想在所有当前正在运行的任务都完成后再停止,使用 QUIT 信号:

kill -QUIT YOUR-WORKER-PID

结束所有子进程,但保留 Worker:

kill -USR1 YOUR-WORKER-PID

暂停和继续执行 Worker:

kill -USR2 YOUR-WORKER-PID

kill -CONT YOUR-WORKER-PID

php resque 计划任务,后台任务和PHP-Resque的使用(四) 使用Worker相关推荐

  1. 管理的职能包括计划、组织、领导、控制这四种基本职能

    一般认为管理的职能包括计划.组织.领导.控制这四种基本职能.而管理职能就是管理活动要做的几类工作: 1. 计划工作 计划工作表现为确立目标和明确达到目标的必要步骤之过程,包括估量机会.建立目标.制定实 ...

  2. php resque 计划任务,PHP-RESQUE - 实现重试

    因为PHP-Resque 的重试部分需要自己写,网上又没啥轮子,而且resque也已经很久不更新了,所以自己研究下resque的源码,然后也借鉴了Laravel的队列重试机制,实现了PHP-Resqu ...

  3. 【天池龙珠计划寒假训练营】python学习笔记(四):利用Pandas分析美国选民总统喜好度

    一.数据准备 1.1 数据集来源介绍 1. 所有候选人信息 该文件为每个候选人提供一份记录,并显示候选人的信息.总收入.从授权委员会收到的转账.付款总额.给授权委员会的转账.库存现金总额.贷款和债务以 ...

  4. resque java_php-resque :基于Redis的后台任务系统

    为什么使用php-resque? php-resque 是轻量级后台任务系统,基于Redis,功能设计简单,配置灵活.相比MQ系统大而全的MQ系统,这个显得小而美. php-resque 角色划分 J ...

  5. 后台任务和PHP-Resque的使用

    后台任务和PHP-Resque的使用(四) 使用Worker 发表于 2015-04-05    |   分类于 PHP    |      |   阅读次数 1134 注意,这篇教程仅适用于Linu ...

  6. 在html游戏里添加计时,如何在计时器上运行后台任务 (HTML)

    如何在计时器上运行后台任务 (HTML) 12/11/2015 本文内容 [ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员.如 ...

  7. SQL语言之执行计划(Oracle)

    执行计划 一条查询语句在Oracle中的执行过程或访问路径的描述: 一.配置执行计划需要显示的项(pl/sql developer) 二.执行计划的常用列字段解释 基数(Cardinality):O ...

  8. 计算机计划实施800字,大学计划书范文800字3篇

    大学计划书范文800字篇一: 要明确大学生活的目的,不盲目,不迷茫.青春对我,我们每个人只有一次,我们无权虚度. 必须从现在开始努力!不要等到毕业时再做无谓的悔恨,再续前时的无奈.把痛苦放在现在,把希 ...

  9. 计算机系大二学期计划范文,大一第二学期学习计划范文

    大一第二学期学习计划范文 大一第二学期学习计划范文1 (一)很快的一个学期过了另一个学期又来了,很不幸的上学期挂了一科,所以从这个学期开始我学习目标要明确,实现目标也有保证.我要短时间内达到一个小目标 ...

最新文章

  1. 都啥时候了,你还怕学了Python找不到工作?
  2. c++学习笔记内联函数,函数重载,默认参数
  3. AI 如何推进全球可持续发展?
  4. XML篇---可配置化的取值方式[便于维护]
  5. jquery 选项卡插件
  6. 怎么选择数据服务器?请记住这五条
  7. 论如何监听一个对象所有属性的变化
  8. Android ping命令 -- Runtime
  9. 直面PHP微服务架构挑战
  10. 对Url Schemes的简单了解
  11. 只做macd二次金叉_MACD指标的各种金叉、二次金叉都是买入信号吗?本文会给你答案...
  12. c语言删除结点,C语言在链表中删除结点
  13. vscode更改配置文件路径_VsCode的jsconfig配置文件说明详解
  14. 通过UDP广播实现Android局域网Peer Discovering
  15. 怎么写c++ documentation_球鞋鞋标怎么看真假、有几种 耐克鞋标鉴定方法推荐
  16. SPSS操作(五):主成分分析
  17. ECRS分析原则(转载)
  18. 万物皆可秒——淘宝秒杀Python脚本,扫货618,备战双11!
  19. matlab 巴特沃斯滤波器频率响应,巴特沃斯滤波器matlab实现
  20. Docker 配置国内镜像加速器

热门文章

  1. 小米商城 -- vue项目实战
  2. Redis缓存热key问题常用解决方案
  3. assert.fail()详解
  4. 项目全生命周期管理的规范文档
  5. Lightdm Ubuntu轻量级桌面显示管理器配置
  6. level design : in pursuit of better levels 原文以及中文译本
  7. NLP学习笔记(五) 注意力机制
  8. day22~day23初识面向对象
  9. 小区停车乱、停车难如何解决——走进小区的智慧停车
  10. scRNA_seq:单细胞转录组测序简介