neoseeker / fresque
一个用于管理你的php-resque工作进程的命令行工具
Requires
- php: >=5.3.0
- chrisboulton/php-resque: >=1.2
- zetacomponents/base: >=1.8
- zetacomponents/console-tools: >=1.6
Suggests
- kamisama/php-resque-ex: PHP port of Resque, with phpredis support, and more logging options
README
#Fresque
Fresque是一个用于管理你的php-resque工作进程的命令行工具。
##先决条件
如果你不知道什么是resque或redis,请查看它们的官方网站
- Redis : https://redis.ac.cn/
- Resque : https://github.com/defunkt/resque/
- Php-Resque : https://github.com/chrisboulton/php-resque/
这个工具旨在通过使与php-resque的交互更加简单和友好来简化你的生活。你应该已经对php-resque有一定的了解,并且已经安装并运行了php-resque。在这个教程中,我将假设你已经有足够的知识来使用php-resque正常启动一个工作进程。
##什么是Fresque
Fresque是一个命令行工具。但它不是通过
$ QUEUE=file_serve php resque.php
来启动一个工作进程,而是
$ fresque start -q file_serve
它更友好,并提供更多选项,如重启
、停止
等……Php-resque和resque默认不提供一种现成的方式来停止你的工作进程。你只需终止工作进程。有了Fresque,你可以轻松地停止和重启你的工作进程。
##安装
克隆git仓库
$ git clone git://github.com/kamisama/Fresque.git
cd
到你刚刚克隆的Fresque文件夹
$ cd the/fresque/folder/you/just/cloned
然后下载Composer
$ curl -s https://getcomposer.org/installer | php
最后,安装依赖项
$ php composer.phar install
注意:官方php-resque使用redisent作为redis api。如果你想使用php-redis,请查看我的分支。
##配置
提供了一个fresque.ini文件来设置你的工作进程的默认参数,以及其他由fresque使用的选项,例如redis连接选项。它有良好的文档,你应该不会有困难地填写它。
##使用方法
一些示例可以在本页面的末尾找到。
通常,首先将fresque可执行文件添加到你的系统路径中是明智的。然后你只需调用
$ fresque <command>
或者如果你没有添加它,
$ cd /path/to/the/resque/executable
$ ./fresque <command>
有很多有趣的命令可用
- start
注意:在Neoseeker上,我们已经覆盖了start命令以像加载一样操作,这将启动预定义的工作进程。
要启动一个新的resque工作进程。默认情况下,它将使用在fresque.ini中定义的默认配置,用于队列名称、轮询频率以及其他各种选项。你可以使用选项标志覆盖所有这些。可用选项
-u
或--user
:运行php进程的用户。应该是运行你的php应用程序的用户,通常是apache的www-data。使用不同的用户可能会导致某些情况下的权限问题。
-q
或--queue
:队列名称列表,用逗号分隔。
-i
或--interval
:轮询频率。每次轮询之间的秒数。
-n
或--workers
:在同一队列上工作的工人数量。使用pcntl进行进程fork,确保你的PHP是用它编译的。
-l
或--log
:日志文件的绝对路径。你可以为每个工作进程设置不同的日志。必须具有--user
权限来读取和写入该文件(以及父文件夹,因为如果文件不存在,则会创建该文件)。
要使用不同的选项创建多个队列,只需再次运行start
。
- stop
关闭工作进程。将等待所有任务完成,然后关闭工作进程。如果有多个工作进程正在运行,您需要从工作进程菜单中选择要停止的工作进程。
-f
或--force
:强制关闭,不等待任务完成。所有任务将失败。-w
或--all
:停止所有工作进程,跳过工作进程菜单。
- 重启
重启所有工作进程,保留其设置。
- 加载
启动预定义的一组工作进程(在您的配置文件中设置)。有关更多信息,请参阅fresque.ini。
- 统计信息
显示失败/处理过的任务总数,以及每个工作进程的各种统计信息。
- 查看日志末尾
查看工作进程的日志。如果您有多个日志文件,您需要从日志文件菜单中选择要查看的日志。
- 入队
将任务添加到队列。需要3个参数
queuename:您要将此任务入队的队列名称 jobclass:执行任务的类名称,以及您的应用程序自动加载器必须加载的类。 arguments:传递给任务的逗号分隔的参数列表。
如果任务成功入队,将打印出任务ID。
成功入队任务并不意味着它将成功执行
- 测试
测试您的配置。如果没有提供选项,它将测试您的 fresque.ini。它接受所有选项,让您测试它们。
最后,有一些全局选项,可以用于所有命令。除非您使用这些选项,否则将使用您的配置文件中的默认值。
-s
或--host
:Redis主机名
-p
或--port
:Redis端口号
-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 -p 6390 -q myspecialqueue -l /path/to/remote.log
如果您在别处有配置文件,以及您的php-resque库也在别处
$ fresque start -c /path/to/my-config.ini -b /path/to/my/custom/php-resque
要查看您的工作进程的统计信息(了解您有多少个工作进程,处理/失败的任务数,正常运行时间)
$ fresque stats
应该输出类似的内容
Worker statistics
Jobs Stats
Processed Jobs : 18617
Failed Jobs : 319
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
让我们将任务入队到activity队列
$ fresque enqueue activity PageVisit 5 /index.php 158745693
php-resque将运行此任务,通过实例化类PageVisit
,然后调用带有参数5
、/index.php
和158745693
的perform()
方法。为了实例化PageVisit类,php-resque应该知道在哪里找到它。这应该通过您应用程序的自动加载器(--include
)来完成。
哦,如果您想出于任何原因重启所有工作进程
$ fresque restart
如果您完成工作,并且想要停止所有工作进程,只需
$ fresque stop --all
它将输出类似的内容
Shutting down Resque Worker complete
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
使用-n 2
创建了2个工作进程)。但有一种方法可以只使用一个命令就启动所有工作进程,这在每次都需要启动许多工作进程时非常有用。
只需在配置文件中的[Queues]部分设置所有工作进程的设置(配置文件的说明中可找到操作流程),然后使用以下命令启动所有工作进程:
$ fresque load
##注意事项
###可以使用test
测试您的配置
提供了一个用于测试配置文件的测试工具,只需调用test
。这将测试运行fresque所需的最小要求
- 您的Redis主机名和端口号不为空
- 您可以使用指定的主机名:端口号连接到Redis服务器
- 日志文件存在且可写,或者如果不存在,其父目录可写
- php-resque库的路径有效
- 您应用程序的自动加载器路径有效
此操作不会测试应用程序自动加载器的内容,因此如果其中包含触发致命错误的代码,fresque将无法知道,并将返回一个成功,但工作进程将无法启动,就像我们上面说的那样。
您可以通过传递选项来测试配置文件内的更多设置。选项将覆盖配置中定义的设置
$ fresque test -s 195.168.1.26 -p 6890
这将测试您的配置文件,但使用指定的Redis主机名和端口号
您还可以测试其他配置文件
$ fresque test -c /my/other/config/file.ini
测试结果将如下所示
Testing configuration
Redis configuration .....OK
Redis server ............OK
Log File ................OK
PHPResque library .......OK
Application autoloader ..OK
Your settings seems ok
##已知问题
###stop
命令无法停止工作进程
当您尝试停止工作进程时,会出现这种情况,但会显示“没有要终止的活动工作进程…”。使用stats
查看将告诉您有工作进程。这发生在--user
没有足够的权限来终止工作进程,或者工作进程PID被“更改”时。在某些奇怪的情况下,工作进程会fork一个子进程来执行作业,但在之后没有切换回父作业。子进程成为父工作进程,但没有通知Resque,工作进程列表过时。
终止这些“流浪”工作进程的唯一方法是通过找到它们的PID并手动终止它们。
ps aux | grep resque.php
它将打印进程列表。找到流浪工作进程的PID并终止它们
sudo kill YOUR_PID
##注意事项
###查看您的日志
日志会告诉您有关作业问题和php-resque工作进程当前状态的所需所有信息。它会告诉您作业何时入队,何时即将执行,以及其问题(成功/失败)。它还会显示可能发生的所有php相关错误。请经常检查它们,因为fresque不会捕获这些错误。
##背景
Fresque是我另一个插件cake-resque的衍生作品,是一个用于管理php-resque的命令行工具,但位于cakephp控制台中。非常方便,但仅限于cakephp框架。我希望发布一个可以在任何php环境中工作的工具。
##致谢
- PHP-Resque由Chris Boulton编写
- 基于Resque by defunkt
- Fresque由Wan Qi Chen(kamisama)编写