Passthru: примеры (PHP)

Использование passthru в PHP для выполнения внешних команд
Раздел: Системные команды
passthru(string $command, int &$result_code = null): ?false

Основы функции passthru

Функция passthru() выполняет внешнюю команду и выводит её результат напрямую. Отличительная особенность – прямой вывод бинарных данных без буферизации.

Когда применяется passthru

Функция применяется для выполнения системных команд, требующих вывода бинарных данных: обработка изображений, потоковое воспроизведение видео, работа с архивами.

Аргументы функции

command (обязательный): строка с командой для выполнения.

result_code (опциональный): переменная для сохранения кода возврата. Ненулевое значение указывает на ошибку.

Простые примеры использования

Базовое выполнение команды

Вывод списка файлов:

<?
passthru('ls -la');
?>
total 12
drwxr-xr-x  2 user user 4096 Jan 10 10:00 .
drwxr-xr-x 10 user user 4096 Jan  9 09:00 ..
-rw-r--r--  1 user user   78 Jan 10 10:00 index.php
С получением кода возврата
<?
passthru('pwd', $return_code);
echo "Код возврата: $return_code";
?>
/home/user/project
Код возврата: 0

Альтернативные функции PHP

Возвращает последнюю строку вывода, полный вывод доступен через второй параметр.

system()

Выводит результат выполнения и возвращает последнюю строку.

Возвращает весь вывод команды в виде строки.

proc_open()

Предоставляет детальный контроль над процессом выполнения команд.

passthru применяется при работе с бинарными данными, остальные – для текстового вывода.

Аналоги в других языках

Python: subprocess.run()
import subprocess
result = subprocess.run(['ls', '-la'], capture_output=True, text=True)
print(result.stdout)
Node.js: child_process.exec()
const { exec } = require('child_process');
exec('ls -la', (error, stdout, stderr) => {
  console.log(stdout);
});
Bash: прямое выполнение
ls -la

В отличие от PHP, Python и Node.js предоставляют более структурированный интерфейс.

Типичные ошибки

Неэкранированные пользовательские данные
<?
$user_input = "; rm -rf /";
passthru("ls $user_input");
?>
[Опасная команда выполняется]
Игнорирование кода возврата
<?
passthru('command_not_found');
echo "Скрипт продолжает работу";
?>
sh: 1: command_not_found: not found
Скрипт продолжает работу

Изменения в версиях PHP

В PHP 8.0 не было значительных изменений функции passthru(). В PHP 7.4 улучшена обработка ошибок при выполнении команд. Рекомендуется всегда использовать последние версии PHP для безопасности.

Расширенные примеры

Конвертация изображения
Пример php
<?
header('Content-Type: image/png');
passthru('convert input.jpg -resize 800x600 png:-');
?>
Потоковое видео
Пример php
<?
header('Content-Type: video/mp4');
passthru('ffmpeg -i input.mp4 -c copy -f mp4 pipe:1');
?>
Работа с архивами
Пример php
<?
header('Content-Disposition: attachment; filename="archive.tar"');
header('Content-Type: application/x-tar');
passthru('tar -cf - directory/');
?>
Выполнение с таймаутом
Пример php
<?
$timeout = 5;
$cmd = "timeout $timeout long_running_command";
passthru($cmd, $code);
if($code == 124) echo "Команда прервана по таймауту";
?>

PHP passthru function comments

En
Passthru Execute an external program and display raw output