# ZendX_Console_Process_Unix

## Introduction

`ZendX_Console_Process_Unix` allows developers to spawn an object as a new process, and so do multiple tasks in parallel on console environments. Through its specific nature, it is only working on *nix based systems like Linux, Solaris, Mac/OSx and such. Additionally, the `shmop_*`, `pcntl_*` and `posix_*` modules are required for this component to run. If one of the requirements is not met, it will throw an exception after instantiating the component.

## Basic usage of ZendX_Console_Process_Unix

`ZendX_Console_Process_Unix` is an abstract class, which requires the user to extend it. It has a single abstract method called `_run()` which has to be implemented to create a working process. It also comes with multiple methods for checking the alive status and share variables between the parent and the child process.

The `_run()` method and every method which is called by it is executed by the child process. Every other method which is called directly by the parent is executed by the parent process.

`setVariable()` and `getVariable()` can be used from both the parent- and the child process to share variables. To observe the alive status, the child process should call `_setAlive()` in a frequent interval, so that the parent process can check the last alive time via `getLastAlive()`. To get the PID of the child process, the parent can call `getPid()`.

### Basic example for processing

This example illustrates a basic child process

    class MyProcess extends ZendX_Console_Process_Unix
    {
        protected function _run()
        {
            for ($i = 0; $i < 10; $i++) {
                // Doing something really important which can't wait: sleeping
                sleep(1);
            }
        }
    }

    // This part should last about 10 seconds, not 20.
    $process1 = new MyProcess();
    $process1->start();

    $process2 = new MyProcess();
    $process2->start();

    while ($process1->isRunning() || $process2->isRunning()) {
        sleep(1);
    }

    echo 'All processes completed';

In this example a process is forked twice and executed. As every process runs 10 seconds, the parent process will be finished after 10 seconds (and not 20).