nicklasos
11/5/2014 - 10:03 AM

php parallel fork

php parallel fork

<?php
define('PROCESSES_NUM', 6);

/**
 * @param array $arr
 * @param callable $func
 */
function parallelForeach(array $arr, callable $func)
{
    $pid = null;

    for ($proc_num = 0; $proc_num < PROCESSES_NUM; $proc_num++) {
        $pid = pcntl_fork();
        if ($pid < 0) {
            fwrite(STDERR, "Cannot fork\n");
            exit(1);
        }
        if ($pid == 0) break;
    }

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

    $l = count($arr);
    for ($i = $proc_num; $i < $l; $i += PROCESSES_NUM) {
        $func($arr[$i]);
    }
    exit(0);
}

parallelForeach([1, 2, 3, 4, 5, 6], function ($i) {
    sleep(rand(0, 3));
    echo $i . "\n";
});