The Process Component

The Process Component executes commands in sub-processes.

Installation

You can install the component in many different ways:

  • Use the official Git repository (https://github.com/symfony/Process);
  • Install it via PEAR ( pear.symfony.com/Process);
  • Install it via Composer (symfony/process on Packagist).

Usage

The Symfony\Component\Process\Process class allows you to execute a command in a sub-process:

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
$process->setTimeout(3600);
$process->run();
if (!$process->isSuccessful()) {
    throw new RuntimeException($process->getErrorOutput());
}

print $process->getOutput();

The :method:`Symfony\\Component\\Process\\Process::run` method takes care of the subtle differences between the different platforms when executing the command.

When executing a long running command (like rsync-ing files to a remote server), you can give feedback to the end user in real-time by passing an anonymous function to the :method:`Symfony\\Component\\Process\\Process::run` method:

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;
    }
});

If you want to execute some PHP code in isolation, use the PhpProcess instead:

use Symfony\Component\Process\PhpProcess;

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

New in version 2.1: The ProcessBuilder class has been as of 2.1.

To make your code work better on all platforms, you might want to use the Symfony\Component\Process\ProcessBuilder class instead:

use Symfony\Component\Process\ProcessBuilder;

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