Process
extends EventEmitter
in package
Process component.
This class borrows logic from Symfony's Process component for ensuring compatibility when PHP is compiled with the --enable-sigchild option.
This class also implements the EventEmitterInterface
which allows you to react to certain events:
exit event:
The exit
event will be emitted whenever the process is no longer running.
Event listeners will receive the exit code and termination signal as two
arguments:
```php
$process = new Process('sleep 10');
$process->start();
$process->on('exit', function ($code, $term) {
if ($term === null) {
echo 'exit with code ' . $code . PHP_EOL;
} else {
echo 'terminated with signal ' . $term . PHP_EOL;
}
});
```
Note that `$code` is `null` if the process has terminated, but the exit
code could not be determined (for example
[sigchild compatibility](#sigchild-compatibility) was disabled).
Similarly, `$term` is `null` unless the process has terminated in response to
an uncaught signal sent to it.
This is not a limitation of this project, but actual how exit codes and signals
are exposed on POSIX systems, for more details see also
[here](https://unix.stackexchange.com/questions/99112/default-exit-code-when-process-is-terminated).
It's also worth noting that process termination depends on all file descriptors
being closed beforehand.
This means that all [process pipes](#stream-properties) will emit a `close`
event before the `exit` event and that no more `data` events will arrive after
the `exit` event.
Accordingly, if either of these pipes is in a paused state (`pause()` method
or internally due to a `pipe()` call), this detection may not trigger.
Table of Contents
Properties
- $pipes : array<string|int, ReadableStreamInterface|WritableStreamInterface|DuplexStreamInterface>
- Array with all process pipes (once started)
- $stderr : ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface
- $stdin : WritableStreamInterface|null|DuplexStreamInterface|ReadableStreamInterface
- $stdout : ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface
- $listeners : mixed
- $onceListeners : mixed
- $cmd : mixed
- $cwd : mixed
- $enhanceSigchildCompatibility : mixed
- $env : mixed
- $exitCode : mixed
- $fallbackExitCode : mixed
- $fds : mixed
- $process : mixed
- $sigchild : mixed
- $sigchildPipe : mixed
- $status : mixed
- $stopSignal : mixed
- $termSignal : mixed
Methods
- __construct() : mixed
- Constructor.
- close() : mixed
- Close the process.
- emit() : mixed
- getCommand() : string
- Get the command string used to launch the process.
- getExitCode() : int|null
- Get the exit code returned by the process.
- getPid() : int|null
- Get the process ID.
- getStopSignal() : int|null
- Get the signal that caused the process to stop its execution.
- getTermSignal() : int|null
- Get the signal that caused the process to terminate its execution.
- isRunning() : bool
- Return whether the process is still running.
- isSigchildEnabled() : bool
- Return whether PHP has been compiled with the '--enable-sigchild' option.
- isStopped() : bool
- Return whether the process has been stopped by a signal.
- isTerminated() : bool
- Return whether the process has been terminated by an uncaught signal.
- listeners() : array<string|int, mixed>
- on() : mixed
- once() : mixed
- removeAllListeners() : mixed
- removeListener() : mixed
- setSigchildEnabled() : void
- Enable or disable sigchild compatibility mode.
- start() : mixed
- Start the process.
- terminate() : bool
- Terminate the process with an optional signal.
- closeExitCodePipe() : mixed
- Close the fourth pipe used to relay an exit code.
- getCachedStatus() : array<string|int, mixed>
- Return the cached process status.
- getFreshStatus() : array<string|int, mixed>
- Return the updated process status.
- pollExitCodePipe() : mixed
- Check the fourth pipe for an exit code.
- updateStatus() : mixed
- Update the process status, stop/term signals, and exit code.
Properties
$pipes
Array with all process pipes (once started)
public
array<string|int, ReadableStreamInterface|WritableStreamInterface|DuplexStreamInterface>
$pipes
= array()
Unless explicitly configured otherwise during construction, the following standard I/O pipes will be assigned by default:
- 0: STDIN (
WritableStreamInterface
) - 1: STDOUT (
ReadableStreamInterface
) - 2: STDERR (
ReadableStreamInterface
)
$stderr
public
ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface
$stderr
$stdin
public
WritableStreamInterface|null|DuplexStreamInterface|ReadableStreamInterface
$stdin
$stdout
public
ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface
$stdout
$listeners
protected
mixed
$listeners
= []
$onceListeners
protected
mixed
$onceListeners
= []
$cmd
private
mixed
$cmd
$cwd
private
mixed
$cwd
$enhanceSigchildCompatibility
private
mixed
$enhanceSigchildCompatibility
$env
private
mixed
$env
$exitCode
private
mixed
$exitCode
$fallbackExitCode
private
mixed
$fallbackExitCode
$fds
private
mixed
$fds
$process
private
mixed
$process
$sigchild
private
static mixed
$sigchild
$sigchildPipe
private
mixed
$sigchildPipe
$status
private
mixed
$status
$stopSignal
private
mixed
$stopSignal
$termSignal
private
mixed
$termSignal
Methods
__construct()
Constructor.
public
__construct(string $cmd[, null|string $cwd = null ][, null|array<string|int, mixed> $env = null ][, null|array<string|int, mixed> $fds = null ]) : mixed
Parameters
- $cmd : string
-
Command line to run
- $cwd : null|string = null
-
Current working directory or null to inherit
- $env : null|array<string|int, mixed> = null
-
Environment variables or null to inherit
- $fds : null|array<string|int, mixed> = null
-
File descriptors to allocate for this process (or null = default STDIO streams)
Tags
close()
Close the process.
public
close() : mixed
This method should only be invoked via the periodic timer that monitors the process state.
emit()
public
emit(mixed $event[, array<string|int, mixed> $arguments = [] ]) : mixed
Parameters
- $event : mixed
- $arguments : array<string|int, mixed> = []
getCommand()
Get the command string used to launch the process.
public
getCommand() : string
Return values
stringgetExitCode()
Get the exit code returned by the process.
public
getExitCode() : int|null
This value is only meaningful if isRunning() has returned false. Null will be returned if the process is still running.
Null may also be returned if the process has terminated, but the exit code could not be determined (e.g. sigchild compatibility was disabled).
Return values
int|nullgetPid()
Get the process ID.
public
getPid() : int|null
Return values
int|nullgetStopSignal()
Get the signal that caused the process to stop its execution.
public
getStopSignal() : int|null
This value is only meaningful if isStopped() has returned true. Null will be returned if the process was never stopped.
Return values
int|nullgetTermSignal()
Get the signal that caused the process to terminate its execution.
public
getTermSignal() : int|null
This value is only meaningful if isTerminated() has returned true. Null will be returned if the process was never terminated.
Return values
int|nullisRunning()
Return whether the process is still running.
public
isRunning() : bool
Return values
boolisSigchildEnabled()
Return whether PHP has been compiled with the '--enable-sigchild' option.
public
final static isSigchildEnabled() : bool
Tags
Return values
boolisStopped()
Return whether the process has been stopped by a signal.
public
isStopped() : bool
Return values
boolisTerminated()
Return whether the process has been terminated by an uncaught signal.
public
isTerminated() : bool
Return values
boollisteners()
public
listeners([mixed $event = null ]) : array<string|int, mixed>
Parameters
- $event : mixed = null
Return values
array<string|int, mixed>on()
public
on(mixed $event, callable $listener) : mixed
Parameters
- $event : mixed
- $listener : callable
once()
public
once(mixed $event, callable $listener) : mixed
Parameters
- $event : mixed
- $listener : callable
removeAllListeners()
public
removeAllListeners([mixed $event = null ]) : mixed
Parameters
- $event : mixed = null
removeListener()
public
removeListener(mixed $event, callable $listener) : mixed
Parameters
- $event : mixed
- $listener : callable
setSigchildEnabled()
Enable or disable sigchild compatibility mode.
public
final static setSigchildEnabled(bool $sigchild) : void
Sigchild compatibility mode is required to get the exit code and determine the success of a process when PHP has been compiled with the --enable-sigchild option.
Parameters
- $sigchild : bool
start()
Start the process.
public
start([LoopInterface|null $loop = null ][, float $interval = 0.1 ]) : mixed
After the process is started, the standard I/O streams will be constructed and available via public properties.
This method takes an optional LoopInterface|null $loop
parameter that can be used to
pass the event loop instance to use for this process. You can use a null
value
here in order to use the default loop.
This value SHOULD NOT be given unless you're sure you want to explicitly use a
given event loop instance.
Parameters
- $loop : LoopInterface|null = null
-
Loop interface for stream construction
- $interval : float = 0.1
-
Interval to periodically monitor process state (seconds)
Tags
terminate()
Terminate the process with an optional signal.
public
terminate([int $signal = null ]) : bool
Parameters
- $signal : int = null
-
Optional signal (default: SIGTERM)
Return values
bool —Whether the signal was sent successfully
closeExitCodePipe()
Close the fourth pipe used to relay an exit code.
private
closeExitCodePipe() : mixed
This should only be used if --enable-sigchild compatibility was enabled.
getCachedStatus()
Return the cached process status.
private
getCachedStatus() : array<string|int, mixed>
Return values
array<string|int, mixed>getFreshStatus()
Return the updated process status.
private
getFreshStatus() : array<string|int, mixed>
Return values
array<string|int, mixed>pollExitCodePipe()
Check the fourth pipe for an exit code.
private
pollExitCodePipe() : mixed
This should only be used if --enable-sigchild compatibility was enabled.
updateStatus()
Update the process status, stop/term signals, and exit code.
private
updateStatus() : mixed
Stop/term signals are only updated if the process is currently stopped or signaled, respectively. Otherwise, signal values will remain as-is so the corresponding getter methods may be used at a later point in time.