cyrilmazur / 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。在此教程中,我将假设你已经有足够的知识来正常启动 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/kamisama/Fresque.git
进入你刚刚克隆的 Fresque 文件夹
$ cd Fresque
然后下载 Composer
$ curl -s https://getcomposer.org/installer | php
最后,安装依赖项
$ php composer.phar install
使用 Composer
如果你的应用程序已经使用 Composer,只需将 Fresque 添加到你的 composer 依赖项
"require": {
"fresque/fresque": "~1.2.0"
}
并使用 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
跟踪工作进程的日志。如果您有多个日志文件,您将看到日志列表。
- enqueue
将作业添加到队列。需要3个参数
queuename:您将作业排入此队列的队列名称 jobclass:将执行作业的类名称,并且您的应用程序自动加载器必须加载该类。 arguments:传递给作业的参数列表,用逗号分隔。
如果作业成功排入队列,将打印出作业ID
。
成功排入队列的作业并不意味着它会成功执行。
- test
测试您的配置。如果没有提供选项,它将测试您的fresque.ini。它接受所有类型的选项。
最后,还有一些全局选项,可以用于所有命令。除非您使用这些选项,否则将使用配置文件中的默认值。
-s
或--host
:Redis主机名
-p
或--port
:Redis端口号
-b
或--lib
:php-resque库的绝对路径。在您已经拥有自己的库并且不想使用fresque附带的库时使用。
-c
或--config
:您的配置文件的绝对路径。您可以为不同的工作进程使用不同的配置。默认一个是fresque.ini,在可执行文件的同一目录下。
-a
或--autoloader
:您的应用程序入口点的绝对路径。通常,它应该是将自动加载所有作业类的文件。
##示例
让我们使用配置文件(fresque.ini)中定义的默认设置启动工作进程
$ fresque start
让我们启动另一个工作进程,以每秒1次的频率轮询活动队列。此外,我们希望有两个工作进程同时处理这个队列
$ fresque start -q activity -i 1 -n 2
如果我们还想再启动一个工作进程,同时处理默认和活动队列
$ fresque start -q default,activity
等等,我们还有一个在另一个Redis服务器上的resque。我们希望将它的活动记录在另一个日志文件中:remote.log
$ fresque start -s 192.168.1.26 -p 6390 -q myspecialqueue -l /path/to/remote.log
- -s 192.168.1.26 是Redis服务器的地址
- -p 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, -p 等 ...)与任何命令一起使用
$ fresque stop -c /path/to/my-config.ini -s 192.168.1.26
让我们将一个作业添加到活动队列
$ 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个工作进程,调用5次start
(记住,第二次start
会创建2个工作进程,带有-n 2
)。但是有一种方法只需要一个命令就可以启动所有这些工作进程,这对于每次都要启动很多工作进程非常有用。
只需在配置文件的[Queues]部分设置所有工作进程的设置(在配置文件中可找到说明),然后使用以下命令启动所有工作进程
$ fresque load
##注意事项
###您可以使用test
测试您的配置
提供了一个用于测试您的配置文件的测试工具,通过调用test
。它将测试运行fresque所需的最小要求
- 您的Redis主机名和端口不为空
- 您可以通过指定的主机名:端口连接到Redis服务器
- 日志文件存在且可写,或者如果不存在,则父目录可写
- php-resque库的路径有效
- 您的应用程序自动加载器的路径有效
您可以通过传递选项来测试配置文件中的更多设置。选项将覆盖配置中定义的设置
$ fresque test -s 195.168.1.26 -p 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用户启动和操作工作进程。
在另一个用户下启动工作进程可能会导致权限问题。
##背景
Fresque是我另一个插件cake-resque的衍生作品,它是一个命令行工具,用于管理php-resque,但位于cakephp控制台内部。非常方便,但仅限于cakephp框架。我想要发布一个可以在任何地方使用的工具,只要您有一个终端。
##致谢
- PHP-Resque由Chris Boulton编写
- 基于Resque by defunkt
- Fresque由Wan Qi Chen(kamisama)编写