PHP code example of izabolotnev / fork-manager

1. Go to this page and download the library: Download izabolotnev/fork-manager library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

izabolotnev / fork-manager example snippets


class SampleTask extends \izabolotnev\Task
{

    protected $expectedIterations;

    protected $remainderIterations;

    protected $verbose = false;

    /**
     * @var bool Switch to true if intercepted SIGTERM
     */
    protected $isStopping = false;

    /**
     * @param int  $iterations
     * @param bool $verbose
     */
    public function __construct($iterations, $verbose = false)
    {
        $this->expectedIterations  = max($iterations, 0);
        $this->remainderIterations = $this->expectedIterations;
        $this->verbose             = (bool)$verbose;
    }

    protected function afterFork()
    {
        pcntl_signal(SIGTERM, [$this, 'handlerSigTerm']);

        // For test purposes call handlerSigTerm after Ctrl+C
        pcntl_signal(SIGINT, [$this, 'handlerSigTerm']);
    }

    /**
     * Handler for the SIGTERM signal.
     * Gracefull exit
     */
    public function handlerSigTerm()
    {
        $this->remainderIterations = min($this->expectedIterations, 5);
        $this->isStopping          = true;

        $this->verbose && fputs(\STDOUT, 'Gracefull stop' . PHP_EOL);
    }

    /**
     * Handler for the SIGINT signal/
     * Exit immediately
     */
    public function handlerSigInt()
    {
        $this->expectedIterations = 0;
        $this->isStopping         = true;

        $this->beforeExit();

        exit(0);
    }

    /**
     * @return int
     */
    public function process()
    {
        $date = new \DateTime();

        $pid = getmypid();
        $this->verbose && fputs(\STDOUT, sprintf('Process #%s' . PHP_EOL, $pid));

        $i = 1;

        while ($this->remainderIterations-- > 0) {
            $this->verbose && fputs(\STDOUT, sprintf(
                "Process #%d | %'.03d/%d \033[%sm%s\033[0m" . PHP_EOL,
                $pid,
                $i++,
                $this->expectedIterations,
                $this->isStopping ? '0;33' : '0;32',
                $date->modify('+1 second')->format('Y-m-d H:i:s')
            ));

            sleep(1);
        }

        return 0;
    }
}

$task        = new SampleTask(100, true);
$forkManager = new \izabolotnev\ForkManager($task, 2, [\izabolotnev\ForkManager::DEBUG => true]);

$forkManager->once();