PHP
Как запустить Perl внутри PHP и не сломать безопасность
Короткий ответ: PHP может запустить Perl-скрипт как внешнюю команду через exec(), shell_exec() или proc_open(), если на сервере установлен Perl и такие функции не запрещены. Но это рискованная интеграция: нельзя передавать пользовательский ввод прямо в командную строку, иначе можно получить выполнение лишних команд
Такой запрос обычно возникает в старых проектах, где часть логики написана на Perl, а сайт или форма сделаны на PHP. Правильная задача — не просто “запустить Perl”, а безопасно вызвать заранее известный скрипт, передать ему контролируемые аргументы и обработать результат
Самый простой запуск
Предположим, есть Perl-файл script.pl
#!/usr/bin/perl
print "Perl работает\n";
Запуск из PHP
<?php
$output = shell_exec('perl ' . __DIR__ . '/script.pl');
echo '<pre>' . htmlspecialchars($output, ENT_QUOTES, 'UTF-8') . '</pre>';
Этот пример годится только для теста. В рабочем коде нужно аккуратнее работать с путями, правами и аргументами
Передача аргумента
Если Perl-скрипту нужен аргумент, экранируйте его
<?php
$name = 'Dinar';
$script = __DIR__ . '/script.pl';
$command = 'perl ' . escapeshellarg($script) . ' ' . escapeshellarg($name);
$output = shell_exec($command);
echo htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
escapeshellarg() защищает аргумент от превращения в часть shell-команды. Но это не значит, что можно принимать любой ввод без ограничений. Длину, формат и допустимые значения все равно лучше проверять отдельно
Безопаснее через proc_open
Если нужно передавать данные в stdin и получать stdout/stderr, используйте proc_open(). Он сложнее, но дает больше контроля
<?php
$script = __DIR__ . '/script.pl';
$process = proc_open(
['perl', $script],
[
0 => ['pipe', 'r'],
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
],
$pipes
);
if (!is_resource($process)) {
exit('Не удалось запустить процесс');
}
fwrite($pipes[0], "input data\n");
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]);
$error = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$status = proc_close($process);
echo 'Код завершения: ' . $status . PHP_EOL;
echo htmlspecialchars($output . $error, ENT_QUOTES, 'UTF-8');
Такой подход полезен, если Perl-скрипт не просто печатает одну строку, а принимает входные данные и возвращает результат
Что проверить на сервере
Проверьте, установлен ли Perl
perl -v
Проверьте, запускается ли Perl-скрипт вручную
perl script.pl
Проверьте, разрешены ли функции PHP для запуска внешних команд. На хостингах exec, shell_exec и proc_open часто отключают через disable_functions
Посмотреть это можно через phpinfo() или параметры PHP
Почему это может не работать на хостинге
Многие shared-хостинги запрещают запуск внешних процессов. Это нормальная мера безопасности. Если функция отключена, PHP выдаст ошибку или вернет пустой результат
В таком случае варианты такие: перенести Perl-логику в PHP, запускать задачу на VPS, использовать cron отдельно или сделать API между сервисами
Мини-практика
Сначала запустите Perl-файл вручную в терминале. Затем вызовите его из PHP без аргументов. Потом добавьте один аргумент и обязательно передайте его через escapeshellarg()
Если ручной запуск работает, а запуск из PHP нет, проверьте права, путь к Perl, disable_functions и пользователя, от имени которого работает веб-сервер
Частые ошибки
Передают пользовательский ввод прямо в команду. Это опасно и может привести к выполнению лишних команд
Используют относительный путь к Perl-файлу. Лучше собирать путь через __DIR__
Не проверяют, установлен ли Perl на сервере. На локальном компьютере Perl есть, на хостинге может не быть
Не смотрят stderr. Скрипт может падать, но PHP показывает пустую строку
Пытаются сделать долгий процесс через веб-запрос. Если Perl-скрипт работает долго, лучше выносить его в очередь или cron
Игнорируют ограничения хостинга. Если exec отключен, код не заработает без изменения окружения
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- Open Server: как запустить скачанные PHP-скрипты
- Как запустить PHP-скрипт на сервере: файлы, права, браузер и cron
- Как запустить PHP-файл в браузере через localhost
- Как запустить Telegram-бота на PHP: polling, webhook и сервер