faernandez / fresque
一个用于管理 php-resque 工作的命令行工具
Requires
- php: >=5.3.0
- kamisama/php-resque-ex: >=1.2.5
- kamisama/php-resque-ex-scheduler: ~1.2.2
- kamisama/resque-status: >=0.0.1
- zetacomponents/base: >=1.8
- zetacomponents/console-tools: >=1.6
Requires (Dev)
- mikey179/vfsstream: >=1.2.0
- phpunit/phpunit: ~3.7.0
- satooshi/php-coveralls: dev-master
Suggests
- chrisboulton/php-resque: PHP port of resque (Workers and Queueing)
README
Fresque 是一个用于管理你的 php-resque 工作的命令行工具。
## 前置条件
如果你不知道什么是 resque 或 redis,请查看它们的官方网站
- Redis : https://redis.ac.cn/
- Resque : https://github.com/resque/resque/
- Php-Resque : https://github.com/chrisboulton/php-resque/
这个工具旨在使与 php-resque 的接口更加简单和友好。你应该已经对 php-resque 有一些了解,并且已经安装并运行了 php-resque。在这个教程中,我将假设你已经有足够的知识来正常启动一个工作进程。
## 要求
- Redis
- 系统上已安装
sudo
包
php-resque 将作为 composer 依赖自动安装。
## 什么是 Fresque
Fresque 是一个用于管理你的 php-resque 工作的命令行工具
# Start a worker without fresque
$ QUEUE=file_serve php resque.php
# Starting a worker with fresque
$ fresque start -q file_serve
它更友好,并提供了更多选项,如 restart
、stop
等。Php-resque 和 resque 默认不提供停止你工作的现成方式。你必须直接杀死工作进程。有了 Fresque,你可以轻松地停止和重新启动你的工作进程。不再需要处理系统进程了!
## 安装
通过克隆 git 仓库
$ git clone git://github.com/fahernandez/Fresque.git
进入你刚刚克隆的 Fresque 文件夹
$ cd Fresque
然后下载 Composer
$ curl -s https://getcomposer.org/installer | php
最后,安装依赖项
$ php composer.phar install
使用 Composer
如果你的应用程序已经使用 Composer,只需将 Fresque 添加到你的 composer 依赖项中
"require": {
"fahernandez/fresque": "~1.3.1"
}
并使用 composer update
更新依赖项
## 配置
提供了一个 fresque.ini 文件来设置工作进程默认参数以及 fresque 使用的其他选项,例如 redis 连接选项。它有很好的文档,你应该不会在编辑它时遇到困难。
## 使用方法
为了方便,你应该将 fresque 可执行文件添加到你的系统路径中。然后你可以使用以下方式调用 fresque
$ fresque <command>
或者如果你没有添加它
$ cd /path/to/fresque
$ ./fresque <command>
如果作为 composer 依赖安装,它也存在于 composer bin 文件夹中
$ vendor/bin/fresque <command>
有大量的有趣命令可用
本节的末尾有示例
- start
启动一个新的resque工作进程。默认情况下,它将使用在fresque.ini中定义的默认配置,包括队列名称、池化频率和其他选项。您可以使用选项标志覆盖所有这些配置。
-u
或--user
: 运行php进程的用户。应该是运行您的php应用程序的用户,通常是apache的 www-data。使用不同的用户可能会导致权限问题。
-q
或--queue
: 工作进程轮询的队列名称列表,以逗号分隔。
-i
或--interval
: 轮询频率。每次轮询之间的秒数。
-n
或--workers
: 在同一队列上工作的工人数。
-l
或--log
: 日志文件的绝对或相对路径。您可以分别为每个工作进程设置不同的日志。必须具有--user
读取和写入该文件的权限(以及父文件夹,因为如果文件不存在,则将创建文件)。相对路径是相对于fresque文件夹。
- startScheduler
启动调度程序工作进程。
-i
或--interval
: 轮询频率。每次轮询之间的秒数。
调度程序工作进程默认禁用,您需要在配置文件中的 [Scheduler] 节中启用它。启用后,当使用 load()
时将自动启动。
同一时间只能运行一个调度程序工作进程
- stop
停止工作进程。将等待所有作业完成,然后停止工作进程。如果有多个工作进程正在运行,将显示一个工作进程列表,以选择要停止的工作进程。
-f
或--force
: 立即停止工作进程,不等待当前作业完成处理。这将失败当前作业。-w
或--all
: 同时停止所有工作进程,跳过工作进程菜单。
- pause
暂停工作进程。类似于 stop
,如果有多个工作进程可用,将提示您工作进程列表。
-w
或--all
: 停止所有工作进程,跳过工作进程菜单。
- resume
恢复暂停的工作进程。如果有多个暂停的工作进程,将提示您工作进程列表。
-w
或--all
: 停止所有工作进程,跳过工作进程菜单。
- restart
重新启动所有工作进程,保留它们的设置。
- load
启动一批预定义的工作进程(在配置文件中设置)。有关更多信息,请参阅fresque.ini。
- stats
显示失败的/处理的作业总数,以及每个工作进程和队列的各种统计信息。
- tail
跟踪工作进程的日志。如果您有多个日志文件,将提示您选择日志文件列表。
- monitor
监控已启动工作进程的状态。如果检测到缺少工作进程,监控将使用初始配置启动工作进程。
- enqueue
将作业添加到队列中。需要3个参数
queuename : 您要将此作业入队的队列名称 jobclass : 执行作业的类名称,以及您的应用程序自动加载器必须加载的类。 arguments : 以逗号分隔的参数列表,传递给作业。
如果作业成功入队,将打印 作业 ID。
成功入队作业并不意味着它可以成功执行
- test
测试您的配置。如果没有提供选项,它将测试您的 fresque.ini。它接受所有类型的选项。
最后,还有一些全局选项,可以用于所有命令。除非您使用这些选项,否则将使用配置文件中的默认值。
-s
或--host
: Redis主机名和端口(默认localhost:6379)
-b
或--lib
: php-resque库的绝对路径。当您已经有了自己的库,并且不希望使用fresque中提供的库时使用。
-c
或--config
:配置文件的绝对路径。您可以为不同的工作者使用不同的配置文件。默认配置文件为fresque.ini,位于可执行文件相同的目录下。
-a
或--autoloader
:应用程序入口点的绝对路径。通常,它应该是将自动加载所有工作类文件的文件。
##示例
使用配置文件(fresque.ini)中定义的默认设置启动工作者。
$ fresque start
启动另一个工作者,轮询activity队列,轮询频率为1秒。同时,我们希望有两个工作者在此队列上工作。
$ fresque start -q activity -i 1 -n 2
如果我们想再启动一个工作者,同时处理default和activity队列。
$ fresque start -q default,activity
等等,我们在另一个Redis服务器上还有一个Resque。我们希望将其活动记录在另一个日志文件中:remote.log
$ fresque start -s 192.168.1.26:6390 -q myspecialqueue -l /path/to/remote.log
-s 192.168.1.26:6390
是Redis服务器的地址。-q
是队列名称。-l
是日志文件的路径。
如果您的配置文件和php-resque库不在同一个地方
$ fresque start -c /path/to/my-config.ini -b /path/to/my/custom/php-resque
查看您的工作者的统计信息(了解您有多少工作者,已处理/失败作业数量,运行时间等 ...)
$ fresque stats
应该输出类似以下内容
-----------------
Resque statistics
-----------------
Jobs Stats
Processed Jobs : 18,617
Failed Jobs : 319
Queues Stats
Queues count : 3
- default : 0 pending jobs
- myspecialqueue : 0 pending jobs
- activity : 0 pending jobs
Workers Stats
Active Workers : 6
Worker : KAMISAMA-MAC.local:33197:default
- Started on : Wed May 16 00:33:04 EDT 2012
- Uptime : less than a minute
- Processed Jobs : 0
- Failed Jobs : 0
Worker : KAMISAMA-MAC.local:33207:default
- Started on : Wed May 16 00:33:08 EDT 2012
- Uptime : less than a minute
- Processed Jobs : 0
- Failed Jobs : 0
Worker : KAMISAMA-MAC.local:33215:myspecialqueue
- Started on : Wed May 16 00:33:10 EDT 2012
- Uptime : less than a minute
- Processed Jobs : 0
- Failed Jobs : 0
Worker : KAMISAMA-MAC.local:33232:activity
- Started on : Wed May 16 00:33:16 EDT 2012
- Uptime : less than a minute
- Processed Jobs : 0
- Failed Jobs : 0
Worker : KAMISAMA-MAC.local:33233:activity
- Started on : Wed May 16 00:33:16 EDT 2012
- Uptime : less than a minute
- Processed Jobs : 0
- Failed Jobs : 0
Worker : KAMISAMA-MAC.local:33223:default,activity
- Started on : Wed May 16 00:33:13 EDT 2012
- Uptime : less than a minute
- Processed Jobs : 0
- Failed Jobs : 0
请记住,您可以将全局选项(-s等 ...)与任何命令一起使用
$ fresque stop -c /path/to/my-config.ini -s 192.168.1.26
让我们将作业入队到activity队列
$ fresque enqueue activity PageVisit "5,/index.php,158745693"
php-resque将运行此作业,通过实例化类PageVisit
,然后调用带有参数5
、/index.php
和158745693
的perform()
方法。
为了实例化PageVisit类,php-resque应该知道在哪里找到它。这应该在您的应用程序自动加载器中完成(无论是使用自动加载器还是include/require)。
哦,如果您想出于任何原因重新启动所有工作者
$ fresque restart
如果您完成了,并想停止所有工作者,只需
$ fresque stop --all
它将输出类似以下内容
----------------
Stopping workers
----------------
Killing 6 workers ...
Killing 33197 … Done
Killing 33207 … Done
Killing 33215 … Done
Killing 33232 … Done
Killing 33233 … Done
Killing 33223 … Done
###一次启动所有您最喜欢的工作者
我们刚刚创建了6个工作者,调用start
5次(记住,第二次start
使用-n 2
创建了2个工作者)。但有一种方法可以用一个命令启动所有这些工作者,这在您必须每次都启动许多工作者时非常有用。
只需在配置文件的[Queues]部分设置所有工作者的设置(在配置文件中提供有关如何设置的说明),然后使用以下命令启动所有这些工作者
$ fresque load
###监控您的工作者您可以将监控功能作为cron作业添加,以保持对所有工作者的监控。假设我们想要每2分钟检查一次我们的工作者是否存活。
# m h dom mon dow command
*/2 * * * * fresque monitor
##注意
###您可以使用test
测试您的配置
提供了一种测试配置文件的测试工具,通过调用test
。它将测试运行fresque所需的最小要求。
- 您的Redis主机名和端口号不为空。
- 您可以使用指定的主机名:端口号连接到Redis服务器。
- 日志文件存在且可写,或者如果不存在,则其父目录可写。
- php-resque库的路径有效。
- 您的应用程序自动加载器的路径有效。
您可以通过传递选项来测试配置文件中的更多设置。选项将覆盖配置中定义的设置。
$ fresque test -s 195.168.1.26:6890
这将测试您的配置文件,但使用指定的Redis主机名和端口号。
您还可以测试另一个配置文件。
$ fresque test -c /my/other/config/file.ini
测试结果看起来像这样
---------------------
Testing configuration
---------------------
Testing configuration
Redis configuration .....OK
Redis server ............OK
Log File ................OK
PHPResque library .......OK
Application autoloader ..OK
Your settings seems ok
##已知问题
###stop
命令的行为不符合预期
情况1:停止工作者时显示“没有这样的进程”
这发生在保存的工作者列表与系统上实际工作者的真实状态不一致时。停止了一个工作者,但fresque没有收到通知。
主要原因是没有使用stop
命令停止工作者,例如在没有先停止工作者的情况下重新启动机器。
解决方案: 使用stop --all
停止所有工作进程,然后使用reset
清除fresque缓存,再次启动您的所有工作进程。
案例2:提示“没有权限”
您没有权限操作工作进程。
解决方案: 您必须以相同的用户启动和停止工作进程。如果您使用start --user=www-data
启动了工作进程,则使用stop --user=www-data
停止它。为了避免这种类型的问题,始终使用相同的用户运行所有工作进程(通常是apache用户),并在fresque.ini中默认设置。
案例3:停止的工作进程有时仍会在工作列表中显示几秒钟
您刚刚使用了stop
命令,停止了一个工作进程。您立即再次使用stop
命令,但工作进程仍然存在。
解决方案: 无需操作。这是完全正常的,停止工作进程可能需要一些时间(它会等待任务完成,或等待下一次轮询停止)。
##注意
###检查日志
日志会告诉您关于任务问题以及php-resque工作进程当前状态的所有信息。它告诉您何时将任务入队,何时即将执行任务及其最终状态(成功/失败)。它还会显示所有可能发生的与php相关的错误。请经常检查它们,因为fresque不会捕获这些错误。
##sudo
sudo是Unix-like计算机操作系统中的一个程序,允许用户以其他用户的权限运行程序。
由于您通常不在与您的web服务器运行的同一用户下登录shell,因此需要sudo
以代表php用户启动和操作工作进程。
以其他用户身份启动工作进程可能会导致权限问题。
##致谢
- PHP-Resque 由Chris Boulton编写
- 基于defunkt的Resque
- 基于原fresque,由Wan Qi Chen(kamisama)编写