How to execute a php script from another php script by using the shell?
Categories:
Executing PHP Scripts from the Shell: A Comprehensive Guide

Learn how to reliably execute one PHP script from another using shell commands, covering various methods, security considerations, and best practices.
Executing a PHP script from within another PHP script using shell commands is a common requirement for tasks like background processing, running cron jobs, or integrating with external tools. This article explores different methods to achieve this, focusing on shell_exec()
, exec()
, passthru()
, and system()
, along with crucial security and performance considerations.
Understanding PHP's Shell Execution Functions
PHP provides several functions to execute external programs and shell commands. While they all serve a similar purpose, their behavior regarding output capture and return values differs significantly. Choosing the right function depends on your specific needs for interacting with the executed script.
flowchart TD A[Calling PHP Script] --> B{Choose Shell Function} B -->|`shell_exec()`| C[Returns full output as string] B -->|`exec()`| D[Returns last line of output, populates array with all lines] B -->|`passthru()`| E[Outputs raw command output directly to browser] B -->|`system()`| F[Outputs raw command output, returns last line] C --> G[Process Output] D --> G E --> G F --> G
Comparison of PHP's shell execution functions
Method 1: Using shell_exec()
for Output Capture
The shell_exec()
function is ideal when you need to capture the entire output of the executed command as a single string. It runs the command and returns everything that the command prints to standard output. This is particularly useful for scripts that generate reports or data that needs to be processed by the calling script.
<?php
// script_to_execute.php
echo "Hello from the executed script!\n";
echo "This is a second line of output.\n";
?>
<?php
// calling_script.php
$command = 'php script_to_execute.php';
$output = shell_exec($command);
if ($output === null) {
echo "Error: Command execution failed or returned no output.\n";
} else {
echo "Output from executed script:\n";
echo $output;
}
?>
/usr/bin/php
or C:\php\php.exe
) and the script you're executing to ensure reliability, especially in different environments or when running from cron jobs.Method 2: Using exec()
for Line-by-Line Output and Return Status
The exec()
function offers more granular control. It executes the command, but by default, it only returns the last line of the command's output. However, you can pass an optional second argument (an array) to capture every line of output, and a third argument to get the command's return status code. This is useful for checking if the executed script completed successfully.
<?php
// script_to_execute_with_status.php
$status = rand(0, 1); // Simulate success (0) or failure (1)
if ($status === 0) {
echo "Task completed successfully.\n";
exit(0);
} else {
echo "Task failed with an error.\n";
exit(1);
}
?>
<?php
// calling_script.php (using exec())
$command = 'php script_to_execute_with_status.php';
$output_lines = [];
$return_status = 0;
$last_line = exec($command, $output_lines, $return_status);
echo "Last line of output: " . $last_line . "\n";
echo "All output lines:\n";
foreach ($output_lines as $line) {
echo "- " . $line . "\n";
}
if ($return_status === 0) {
echo "Command executed successfully (status: " . $return_status . ").\n";
} else {
echo "Command failed (status: " . $return_status . ").\n";
}
?>
escapeshellarg()
or escapeshellcmd()
.Security Considerations and Best Practices
Executing shell commands from PHP is powerful but inherently risky if not handled carefully. Command injection is a major threat where malicious users can inject arbitrary commands into your system. Always follow these best practices:
1. Sanitize User Input
Use escapeshellarg()
for individual arguments and escapeshellcmd()
for the entire command string. escapeshellarg()
is generally preferred for arguments, as escapeshellcmd()
can be less robust for complex commands.
2. Use Full Paths
Specify the full path to the executable (e.g., /usr/bin/php
) and the script to avoid relying on the system's PATH environment variable, which can be manipulated.
3. Limit Permissions
Ensure the user running the web server (e.g., www-data
, apache
) has only the necessary permissions to execute the target script and nothing more. Restrict access to sensitive files.
4. Avoid Direct Shell Execution for Complex Tasks
For complex inter-process communication or background jobs, consider message queues (e.g., RabbitMQ, Redis) or dedicated job schedulers (e.g., Gearman, Supervisor) instead of direct shell calls.
5. Error Handling
Always check the return status and output of shell commands to detect failures and handle them gracefully. Log errors for debugging.
<?php
// Example of safe command execution
$user_input = 'some_value; rm -rf /'; // Malicious input attempt
$safe_input = escapeshellarg($user_input);
$command = 'php process_data.php ' . $safe_input;
$output = shell_exec($command);
echo "Command executed: " . $command . "\n";
echo "Output: " . $output . "\n";
?>