freelancehunt / fresque
管理php-resque工作进程的命令行工具
Requires
- php: >=8.0
- ext-pcntl: *
- zetacomponents/base: ^1.9
- zetacomponents/console-tools: ^1.7
Requires (Dev)
- mikey179/vfsstream: ^1.6.10
- php-coveralls/php-coveralls: ^2.3
- phpunit/phpunit: ^9.5
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/freelancehunt/fresque.git
将cd
到您刚刚克隆的Fresque文件夹中
$ cd fresque
然后下载Composer
$ wget https://raw.githubusercontent.com/composer/getcomposer.org/76a7060ccb93902cd7576b67264ad91c8a2700e2/web/installer -O - -q | php -- --quiet
最后,安装依赖项
$ composer install
使用Composer
如果你的应用程序已经使用了Composer,只需将Fresque添加到你的composer依赖项中
"require": {
"freelancehunt/fresque": "^2.0.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文件夹。
- 停止
停止工作者。将等待所有作业完成,然后停止工作者。如果有多个工作者正在运行,将显示工作者列表,以便选择要停止的工作者。
-f
或--force
:立即停止工作者,不等待当前作业处理完成。这将失败当前作业。-w
或--all
:一次性停止所有工作者,跳过工作者菜单。
- 暂停
暂停工作者。类似于 stop
,如果有多个工作者可用,将提示工作者列表。
-w
或--all
:停止所有工作者,跳过工作者菜单。
- 恢复
恢复暂停的工作者。如果有多个暂停的工作者,将提示工作者列表。
-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
启动另一个工作者,每1秒轮询一次 activity 队列。我们希望有两个工作者在这个队列上工作
$ 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
- -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
将作业入队到 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个工作进程,调用了5次start
(记住,第二次start
使用-n 2
创建2个工作进程)。但是有一种方法只需一个命令就可以启动所有工作进程,这在您每次都必须启动许多工作进程时非常有用。
只需在配置文件中的[Queues]部分设置所有工作进程的设置(配置文件中有说明),然后使用以下命令启动所有工作进程:
$ fresque load
注意
您可以使用test
测试您的配置
提供了一个测试配置文件的测试工具,通过调用test
。它将测试运行fresque所需的最小要求
- 您的redis主机名和端口号不为空
- 您可以使用指定的主机名:端口号连接到redis服务器
- 日志文件存在且可写,或者如果它不存在,则父目录可写
- php-resque库的路径有效
- 您的应用程序自动加载器的路径有效
您可以通过传递选项来测试config文件中的设置以外的更多内容。选项将覆盖config中定义的设置
$ 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编写的。
- 基于defunkt的Resque。
- Fresque由Wan Qi Chen(kamisama)编写。