Puppollo
8/15/2014 - 1:59 PM

fork processes

fork processes

<?php
/**
 * @param $processes_count
 * @param $jobs_count
 * @param $func
 * @throws ErrorException
 */
function do_parallel_func($processes_count, $jobs_count, $func)
{
    if (!is_numeric($processes_count) || !is_numeric($jobs_count)) {
        throw new ErrorException('processes_count and jobs_count should be numeric, proc: ' . gettype($processes_count) . ', jobs: ' . gettype($jobs_count));
    }
    if ($processes_count <= 0 || $jobs_count <= 0) {
        throw new ErrorException("processes_count and jobs_count should be bigger than zero, proc: {$processes_count}, jobs: {$jobs_count}");
    }
    for ($proc_num = 0; $proc_num < $processes_count; $proc_num++) {
        $pid = pcntl_fork();
        if ($pid < 0) {
            fwrite(STDERR, "Cannot fork\n");
            exit(1);
        }
        if ($pid == 0) {
            break;
        }
    }

    if (!empty($pid)) {
        for ($i = 0; $i < $processes_count; $i++) {
            pcntl_wait($status);
            $exitcode = pcntl_wexitstatus($status);
            if ($exitcode) {
                exit(1);
            }
        }
        return;
    }

    for ($i = $proc_num; $i < $jobs_count; $i += $processes_count) {
        if (is_callable($func)) {
            $func($i, $proc_num);
        }
    }

    exit(0);
}