ssigwart/process-pool

用于将任务发送到后台任务的进程池。

v1.0.5 2024-08-09 03:59 UTC

This package is auto-updated.

Last update: 2024-09-09 04:13:25 UTC


README

此包允许您运行进程池。池将运行多个后台进程来处理发送到池的消息。您可以指定运行的池进程的最小和最大数量。

创建池

$minPoolSize = 1;
$maxPoolSize = 10;
$poolProcessCmd = 'php process.php';
$cwd = '/path/to/pool/process';
$pool = new ProcessPool($minPoolSize, $maxPoolSize, $poolProcessCmd, $cwd);
$pool->setMaxNumSpareProcesses(3);

实现池进程

池进程应实现 ssigwart\ProcessPool\ProcessPoolProcessMessageHandlerInterface。应通过 handleRequest 函数处理传入的请求。它可以输出到 stdoutstderr,可以通过 getStdoutResponsegetStderrResponse 来读取。

以下是一个 /path/to/pool/process/process.php 的示例。

<?php

use ssigwart\ProcessPool\ProcessPoolProcess;
use ssigwart\ProcessPool\ProcessPoolProcessMessageHandlerInterface;

/** My example process */
class MyExampleProcess implements ProcessPoolProcessMessageHandlerInterface
{
	/**
	 * Handle exit request
	 */
	public function handleExit()
	{
		// You can do cleanup here, then call exit
		print 'Existing now.' . PHP_EOL;
		exit;
	}

	/**
	 * Handle request
	 *
	 * @param string $data Data
	 */
	public function handleRequest(string $data)
	{
		// Handle $data here

		// Anything you output will be returned as STDOUT
		print 'You sent data ' . $data . PHP_EOL;

		// You can use error_log to output to STDERR
		error_log('This will be returned as STDERR.');
	}
}

$proc = new ProcessPoolProcess(new MyExampleProcess());
$proc->handleMessages();

向池发送消息

  1. 启动进程
$req1 = $pool->startProcess();
$req1->sendRequest('Your message');
  1. 此时,您应将 $req1 添加到待处理请求的数组中,并将任何其他需要发送的消息发送到队列。将来某个时刻,您应该通过调用 hasStdoutData()hasStderrData() 检查这些进程是否有数据。

  2. 获取输出并释放进程以便可以用于其他请求

$output = $req1->getStdoutResponse();
$errorOutput = $req1->getStderrResponse();
$pool->releaseProcess($req1);

类和公共API

ProcessPool

进程池用于维护池状态,并启动和停止进程。

构造函数 (__construct)

setMaxNumSpareProcesses

设置在进程完成请求后保留运行的备用进程的最大数量。

getNumRunningProcesses

返回正在运行的进程数。正在运行的进程是指当前正在处理请求的进程。

getNumUnassignedProcesses

返回未分配的进程数。未分配的进程是指等待处理请求的进程。

startProcess

启动新进程。

重要!记住,当您完成进程后,要调用池上的 releaseProcess 以释放进程资源。

如果池已达到允许的进程数,则可能会抛出 ProcessPoolPoolExhaustedException

它返回一个 ProcessPoolRequest,您可以将请求发送到它。

releaseProcess

此操作释放了使用 startProcess 启动的进程,并允许它回到备用进程池以处理其他请求。

shutDown

此操作向所有进程发送 "exit" 请求并关闭它们。这应该在处理所有打开的进程之后调用,并且在此之后不应使用池。通常,您不需要调用此函数,因为池注册了一个关闭函数。

ProcessPoolRequest

表示可以处理单个请求的池请求。

sendRequest

hasFailed

如果处理请求的进程已失败,则返回 true。

waitForStdoutOrStderr

等待 STDOUT 或 STDERR 上的数据。

如果可用数据,则返回 true。如果是这样,应调用 hasStdoutDatahasStderrData

hasStdoutData

如果请求有可用的 STDOUT 数据,则返回 true。请注意,这可能在 EOF 时返回 true,但 getStdoutResponse 返回的数据可能为空字符串。

hasStderrData

如果请求有可用的 STDERR 数据,则返回 true。请注意,这可能在 EOF 时返回 true,但 getStderrResponse 返回的数据可能为空字符串。

getStdoutResponse

返回进程的 STDOUT 响应。

getStderrResponse

返回进程的 STDERR 响应。

其他方法

存在一些不应直接调用的附加公共函数。这些包括 sendExitRequestfreeRequestclose

ProcessPoolProcess

该类被后台进程用于等待和处理来自池的消息。

构造函数 (__construct)

handleMessages

此函数负责等待消息并将输出返回给父池进程。