183 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
    }
 | 
						|
} |