Execing Processes in PHP

Here’s the translation of the Go code to PHP, with explanations in Markdown format suitable for Hugo:

Our example demonstrates how to replace the current PHP process with another executable using the exec() function. This is similar to the classic exec function in Unix-like operating systems.

<?php

// For our example we'll exec `ls`. PHP doesn't require an
// absolute path to the binary we want to execute, but it's
// a good practice to use one.
$binary = '/bin/ls';

// exec() in PHP doesn't require arguments in slice form.
// We can pass them as a string.
$args = '-a -l -h';

// In PHP, we don't need to explicitly pass the environment
// variables. The child process inherits the environment
// of the parent process by default.

// Here's the actual exec() call. If this call is successful,
// the execution of our PHP process will end here and be
// replaced by the `/bin/ls -a -l -h` process.
exec("$binary $args");

// If exec() fails, the script will continue here.
echo "This line will only be printed if exec() fails.\n";

When we run our program, it is replaced by ls.

$ php exec-processes.php
total 16
drwxr-xr-x  4 user  136B Oct 3 16:29 .
drwxr-xr-x 91 user  3.0K Oct 3 12:50 ..
-rw-r--r--  1 user  1.3K Oct 3 16:28 exec-processes.php

Note that PHP’s exec() function behaves differently from the syscall in Unix-like systems. It doesn’t completely replace the current process, but rather creates a new process and waits for it to finish. The output of the command is not automatically displayed; you would need to capture and echo it explicitly if you want to see it.

For a closer equivalent to the Unix exec() syscall in PHP, you can use the pcntl_exec() function, which is available when PHP is compiled with process control support:

<?php

$binary = '/bin/ls';
$args = ['-a', '-l', '-h'];

pcntl_exec($binary, $args);

// If pcntl_exec() fails, the script will continue here.
echo "This line will only be printed if pcntl_exec() fails.\n";

This version will completely replace the PHP process with the new process, just like the Unix exec() syscall.

PHP doesn’t offer a classic Unix fork function in its core, but the pcntl extension provides pcntl_fork() for creating child processes. However, for most use cases, PHP’s built-in functions for running external commands (like exec(), system(), or shell_exec()) are sufficient.