brianlmoon / gearmanmanager
PHP守护进程,用于管理gearman工作者
Requires
- php: ^8.0.0
- ext-pcntl: *
- ext-posix: *
Suggests
- ext-gearman: PHP wrapper to libgearman
- brianlmoon/net_gearman: A PHP interface for Gearman (requires version 2.*)
This package is auto-updated.
Last update: 2024-09-24 20:53:37 UTC
README
PHP需求
- PHP 5.5.9(已测试此版本)
- POSIX扩展
- 进程控制扩展
- pecl/gearman 或 Net_Gearman
为什么使用GearmanManager
运行Gearman工作者可能是一项繁琐的任务。需要创建许多具有相同代码行的文件,用于创建工作者、连接到服务器、向工作者添加功能等。GearmanManager的目的是使运行工作者更多地成为操作任务,而不仅仅是开发任务。
基本思想是,一旦部署,你只需要编写实际执行工作的代码,而不是所有重复的工作者设置。我们通过创建包含指定目录中函数的文件来实现这一点。文件名决定了与gearmand服务器注册的函数。这大大简化了函数注册过程。
工作原理
我们首先决定我们的工作者代码将存放在哪里。在这个例子中,假设我们创建一个名为worker_dir的目录来存储所有工作者代码。然后我们会创建像这样的文件:(以下示例使用pecl/gearman语法。对于PEAR/Gearman,请参阅示例pear工作者,以了解细微差异)
过程式
# cat worker_dir/example_function.php
function example_function($job, &$log) {
$workload = $job->workload();
// do work on $job here as documented in pecl/gearman docs
// Log is an array that is passed in by reference that can be
// added to for logging data that is not part of the return data
$log[] = "Success";
// return your result for the client
return $result;
}
此代码的存在将在gearmand服务器上注册一个名为example_function的函数。
面向对象
# cat worker_dir/ExampleFunction.php
class ExampleFunction {
public function run($job, &$log) {
$workload = $job->workload();
// do work on $job here as documented in pecl/gearman docs
// Log is an array that is passed in by reference that can be
// added to for logging data that is not part of the return data
$log[] = "Success";
// return your result for the client
return $result;
}
}
此代码的存在将在gearmand服务器上注册一个名为ExampleFunction的函数。
但是等等!还有更多
除了使工作者创建更容易外,GearmanManager还提供进程管理。如果一个进程死亡,它会重新启动一个新的进程来替代它。您还可以配置工作者在一段时间后死亡,以防止PHP使用过多内存。
然后是向服务器推送新代码的问题。GearmanManager有一个选项可以监视工作者目录,并在检测到服务器上已部署新代码时重新启动工作者。
当关闭GearmanManager时,它将允许工作者进程完成他们的工作后再退出。
高级功能
虽然启动很简单,但您可以使用GearmanManager做一些高级的事情。
配置工作者
默认情况下,GearmanManager确保至少有一个工作者知道如何执行每个在工作者目录中有文件的作业。为了明确,这意味着默认情况下,每个函数将创建一个进程。这显然不适合大多数生产系统。您可以通过几种方式自定义函数的运行进程数。
GearmanManager的ini文件分为一个或多个部分。有一个全局部分[GearmanManager],以及可以针对每个函数有一个部分。在上面的例子中,将是[example_function]或[ExampleFunction]。对于全局部分,有几个选项。代码中有几个示例ini文件。
worker_dir - 定义工作者函数所在的目录(s)。您可以通过逗号分隔来指定多个目录。
include - 这是一个列表,其中应注册此服务器的工作者函数。它可以设置为*以包含工作者目录中定义的所有函数。如果未设置此选项,则*是默认行为。
count - 此设置定义应运行的最低工作进程数,用于执行所有功能。例如,如果count设置为10,将启动10个进程,这些进程已注册执行所有功能。默认值为0。
dedicated_count - 此设置定义应启动多少进程,这些进程将专门用于为每个注册的功能执行单个功能。例如,如果您在worker目录中有5个功能,并将dedicated_count设置为2,则将为每个功能启动2个进程,因此总共有10个进程。默认值为1。
max_worker_lifetime - 将此值设置为工作进程死亡前的最大秒数。完成工作后,工作进程将检查其运行时间是否超过了最大寿命,如果是,则退出。然后,管理进程将用注册执行相同工作的新工作进程替换它。默认值为1小时。
auto_update - 如果设置为1,管理器将分叉一个辅助进程,该进程监视worker目录中的更改。如果找到新代码,则向父进程发送信号以杀死工作进程,以便可以加载新代码。
对于每个注册的功能,您也可以为这些工作进程指定一些选项。
count - 将此设置为某个整数值将确保有那么多工作进程知道如何执行此功能。这并不能保证将有一个专用进程,只能保证某些进程将注册此功能。该进程也可能注册其他功能。
dedicated_count - 将此设置为某个整数值将确保启动了那么多进程,这些进程仅用于执行此功能。进程不会执行除此功能之外的其他工作。
日志数据
命令行中有很多选项。查看-h获取所有选项。日志记录是其中之一。由于配置的加载会记录日志,您必须在命令行上指定日志信息。您应该注意以下两个选项。
-v - 这将启用管理器和工作进程的详细输出。您可以添加更多的v(-vvvv)以获取更多的日志数据。它按此方式扩展
-v Logs only information about the start up and shutdown
-vv Logs information about process creation and exiting
-vvv Logs information about workers and the work they are doing
-vvvv Logs debug information
-vvvvv Logs crazy amounts of data about all manner of things
-l - 您可以指定日志数据将发送到的日志文件。如果未设置,则日志数据将发送到stdout。您也可以将其设置为syslog,以便将日志数据发送到syslog。
指定Gearman服务器
您可以通过两种方式指定服务器。它们可以是命令行或配置文件中的指定。
在命令行上,您可以指定-h [HOST[:PORT][,[HOST[:PORT]]]]。例如:-h 10.1.1.1:4730,10.1.1.2:4730
在配置文件中的全局[ GearmanManager ]部分中,您可以使用以下选项
host - 由逗号分隔的主机和端口号。例如,10.1.1.1:4730,10.1.1.2:4730
运行守护进程
最小命令行是
# ./pecl-manager.php -c /path/to/config.ini
还有一些有用的命令行选项,可用于运行守护进程。
-P - 管理进程应存储pid文件的路径。您也可以使用ini文件中的pid_file进行设置。
-d - 如果在命令行上设置,则管理器将守护进程化
-u - 运行守护进程的用户。您也可以在ini文件中使用user。
调试
所以您构建了一个很棒的工作进程,但出于某种原因它死了,而error_log
却是空的?
GearmanManager偶尔使用抑制操作符(@
),这使得调试变得有些困难,因为错误消息被抑制。
解决方案是Xdebug的scream,设置步骤如下
- 安装Xdebug
- 配置它
- 成功!
安装
pecl install xdebug
配置
将以下内容放入您的xdebug.ini
zend_extension="/path/to/where/your/xdebug.so"
xdebug.scream = 1
xdebug.show_exception_trace = 1