Skip to content

Documenting the non-blocking features of the Process component #2430

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 4, 2013
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 39 additions & 3 deletions components/process.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,16 @@ a command in a sub-process::
$process = new Process('ls -lsa');
$process->setTimeout(3600);
$process->run();

// executes after the the command finishes
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

duplicate the.
@weaverryan a change was needed...

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.
The component 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
Expand All @@ -51,6 +52,41 @@ anonymous function to the
echo 'OUT > '.$buffer;
}
});

.. versionadded:: 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
:method:`Symfony\\Component\\Process\\Process::start` method to start an asynchronous
process, the :method:`Symfony\\Component\\Process\\Process::isRunning` method
to check if the process is done and the
:method:`Symfony\\Component\\Process\\Process::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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// ... do other things


$process->wait(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::
Expand Down