productsupcom/gearmanmanager

PHP守护进程,用于管理gearman工作进程

1.0.3 2022-05-06 11:30 UTC

This package is auto-updated.

Last update: 2024-09-10 23:45:24 UTC


README

PHP需求

  • PHP 5.2.? - 不确定确切版本,5.3.2+适用于composer。
  • 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 - 定义工作函数所在的目录。您可以通过逗号分隔来指定多个目录。

include - 这是一个应该由此服务器注册的工作函数列表。可以是*以包含工作目录中定义的所有函数。如果没有设置此选项,*是默认行为。

count - 此设置定义了应运行的最低工作者数量,以便执行所有功能。例如,如果count设置为10,则将启动10个进程,它们已注册执行所有功能。默认值为0。

dedicated_count - 此设置定义了应为每个注册的功能启动多少个进程,这些进程将只执行一个功能。例如,如果你在工作者目录中有5个功能,并将dedicated_count设置为2,则每个功能将启动2个进程,所以总共10个进程用于这项工作。默认值为1。

max_worker_lifetime - 将此值设置为工作者在死亡之前应该存在的最大秒数。完成工作后,工作者将检查其是否已运行超过最大寿命,如果是,则退出。然后,管理进程将用注册执行退出进程所做相同工作的新工作者替换它。默认值为1小时。

auto_update - 如果设置为1,则管理器将派生一个辅助进程,该进程监视工作者目录中的更改。如果找到新代码,则向父进程发送信号,以杀死工作者进程,以便加载新代码。

对于每个注册的功能,您也可以为这些工作者指定一些选项。

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。

指定Gearmand服务器

您可以通过两种方式指定服务器。它们可以在命令行或配置文件中指定。

在命令行上,您可以使用-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的尖叫,设置它的步骤如下

  1. 安装Xdebug
  2. 配置它
  3. 盈利!

安装

pecl install xdebug

配置

将以下内容放入你的 xdebug.ini

zend_extension="/path/to/where/your/xdebug.so"
xdebug.scream = 1
xdebug.show_exception_trace = 1