El componente Process

El componente Process ejecuta ordenes en subprocesos.

Instalando

Puedes instalar el componente de varias maneras diferentes:

Usando

La clase Symfony\Component\Process\Process te permite ejecutar una orden en un subproceso:

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new \RuntimeException($process->getErrorOutput());
}

print $process->getOutput();

The component takes care of the subtle differences between the different platforms when executing the command.

Nuevo en la versión 2.2: Los métodos getIncrementalOutput() y getIncrementalErrorOutput() fueron añadidos en Symfony 2.2.

El método getOutput() siempre regresa el contenido entero de la salida estándar de la orden y getErrorOutput() el contenido de la salida de error. Alternativamente, los métodos getIncrementalOutput() y getIncrementalErrorOutput() regresan la nueva producción desde la última llamada.

Cuando se ejecuta una orden que consume demasiado tiempo (tal como la resincronización de archivos con un servidor remoto), puedes retroalimentar en tiempo real al usuario final suministrando una función anónima al método run():

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
$process->run(function ($type, $buffer) {
    if ('err' === $type) {
        echo 'ERR > '.$buffer;
    } else {
        echo 'OUT > '.$buffer;
    }
});

Nuevo en la versión 2.1: The non-blocking feature was added in 2.1.

You can also start the subprocess and then let it run asynchronously, retrieving output and the status in your main process whenever you need it. Use the start() method to start an asynchronous process, the isRunning() method to check if the process is done and the getOutput() method to get the output:

$process = new Process('ls -lsa');
$process->start();

while ($process->isRunning()) {
    // waiting for process to finish
}

echo $process->getOutput();

You can also wait for a process to end if you started it asynchronously and are done doing other stuff:

$process = new Process('ls -lsa');
$process->start();

// ... do other things

$process->wait(function ($type, $buffer) {
    if ('err' === $type) {
        echo 'ERR > '.$buffer;
    } else {
        echo 'OUT > '.$buffer;
    }
});

Si deseas ejecutar algún código PHP independiente, en su lugar usa PhpProcess:

use Symfony\Component\Process\PhpProcess;

$process = new PhpProcess(<<<EOF
    <?php echo 'Hello World'; ?>
EOF
);
$process->run();

Nuevo en la versión 2.1: The ProcessBuilder class was added in Symfony 2.1.

Para hacer que tu código trabaje mejor en todas las plataformas, posiblemente en su lugar quieras usar la clase Symfony\Component\Process\ProcessBuilder:

use Symfony\Component\Process\ProcessBuilder;

$builder = new ProcessBuilder(array('ls', '-lsa'));
$builder->getProcess()->run();

Process Timeout

You can limit the amount of time a process takes to complete by setting a timeout (in seconds):

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
$process->setTimeout(3600);
$process->run();

If the timeout is reached, a Symfony\Process\Exception\RuntimeException is thrown.

For long running commands, it is your responsibility to perform the timeout check regularly:

$process->setTimeout(3600);
$process->start();

while ($condition) {
    // ...

    // check if the timeout is reached
    $process->checkTimeout();

    usleep(200000);
}
Bifúrcame en GitHub