How can different PHP functions like passthru, shell_exec, and proc_open be used to interact with external programs effectively?

To interact with external programs effectively in PHP, functions like passthru, shell_exec, and proc_open can be used. Passthru is useful for executing an external program and displaying the output directly. Shell_exec is used to execute a command and return the complete output as a string. Proc_open provides a more flexible way to interact with external programs by allowing input/output streams to be accessed.

// Using passthru to execute an external program
passthru('ls -l');

// Using shell_exec to execute a command and capture the output
$output = shell_exec('ls -l');
echo $output;

// Using proc_open for more advanced interaction with external programs
$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);

$process = proc_open('ls -l', $descriptorspec, $pipes);

if (is_resource($process)) {
    // Write input to the child process if needed
    fwrite($pipes[0], 'input data');

    // Read output from the child process
    echo stream_get_contents($pipes[1]);

    // Close pipes
    fclose($pipes[0]);
    fclose($pipes[1]);

    // Close the process
    proc_close($process);
}