2025-08-01 11:39:06 +08:00

183 lines
3.8 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: Jenner
* Date: 2015/11/3
* Time: 14:37
*/
namespace Jenner\SimpleFork;
/**
* processes' pool
*
* @package Jenner\SimpleFork
*/
abstract class AbstractPool
{
/**
* process list
*
* @var Process[]
*/
protected $processes = array();
/**
* get process by pid
*
* @param $pid
* @return null|Process
*/
public function getProcessByPid($pid)
{
foreach ($this->processes as $process) {
if ($process->getPid() == $pid) {
return $process;
}
}
return null;
}
/**
* shutdown sub process and no wait. it is dangerous,
* maybe the sub process is working.
*/
public function shutdownForce()
{
$this->shutdown(SIGKILL);
}
/**
* shutdown all process
*
* @param int $signal
*/
public function shutdown($signal = SIGTERM)
{
foreach ($this->processes as $process) {
if ($process->isRunning()) {
$process->shutdown(true, $signal);
}
}
}
/**
* if all processes are stopped
*
* @return bool
*/
public function isFinished()
{
foreach ($this->processes as $process) {
if (!$process->isStopped()) {
return false;
}
}
return true;
}
/**
* waiting for the sub processes to exit
*
* @param bool|true $block if true the parent process will be blocked until all
* sub processes exit. else it will check if there are processes that had been exited once and return.
* @param int $sleep when $block is true, it will check sub processes every $sleep minute
*/
public function wait($block = true, $sleep = 100)
{
do {
foreach ($this->processes as $process) {
if (!$process->isRunning()) {
continue;
}
}
usleep($sleep);
} while ($block && $this->aliveCount() > 0);
}
/**
* get the count of running processes
*
* @return int
*/
public function aliveCount()
{
$count = 0;
foreach ($this->processes as $process) {
if ($process->isRunning()) {
$count++;
}
}
return $count;
}
/**
* get process by name
*
* @param string $name process name
* @return Process|null
*/
public function getProcessByName($name)
{
foreach ($this->processes as $process) {
if ($process->name() == $name) {
return $process;
}
}
return null;
}
/**
* remove process by name
*
* @param string $name process name
* @throws \RuntimeException
*/
public function removeProcessByName($name)
{
foreach ($this->processes as $key => $process) {
if ($process->name() == $name) {
if ($process->isRunning()) {
throw new \RuntimeException("can not remove a running process");
}
unset($this->processes[$key]);
}
}
}
/**
* remove exited process
*/
public function removeExitedProcess()
{
foreach ($this->processes as $key => $process) {
if ($process->isStopped()) {
unset($this->processes[$key]);
}
}
}
/**
* return process count
*
* @return int
*/
public function count()
{
return count($this->processes);
}
/**
* get all processes
*
* @return Process[]
*/
public function getProcesses()
{
return $this->processes;
}
}