Вопрос или проблема
Этот вопрос задавался так много раз с отличными предложениями, но внезапное исчезновение спрашивающих действительно не помогает, так как они никогда не возвращаются, чтобы сказать, что сработало (предполагая, что это должно было сработать в конце концов)
Я пытаюсь запустить скрипт на Python из PHP, но не смог. Среда: PHP 7.3, Python 3.8, CentOS 7, Apache 2.4, Bluehost VPS.
-
Пробовал как
exec
, так иshell_exec
-
apachectl -S
показывает, что сервер Apache работает от имени nobody:nobody -
Добавил nobody в sudoer, используя
nobody ALL=(ALL) NOPASSWD: /etc/bin/python3
-
Добавил разрешения на выполнение для скрипта Python и изменил владельца на nobody (так же, как у apache)
ls -l testing.py
показывает-rwxr-xr-x 1 nobody nobody
-
Скрипт Python работает нормально из оболочки.
Вот мой код:
<?php
error_reporting(E_ALL);
$command = 'python3 /home/uploads/testing.py';
$command = escapeshellcmd($command);
$shelloutput = exec($command,$output, $ret_code);
echo "<h1>";
echo $shelloutput;
echo $output;
echo $ret_code;
echo "</h1>";
?>
Скрипт на Python:
#!/usr/bin/env python3
import sys
print("Hello")
sys.exit(8)
Когда я запускаю PHP-файл из браузера, я не получаю абсолютно ничего.
Я был бы признателен за любую помощь в решении этой проблемы.
Выявил, что проблема была в файле php.ini, убрал директиву disable_functions=""
, и скрипт Python заработал. Как упомянул Джеральд в комментариях, мне не нужно было ничего добавлять в файл sudoers или изменять разрешения/пользователей, кроме стандартного атрибута разрешений +x
(или 0755)
.
Ответ или решение
Как запустить Python-скрипт из PHP: решение проблем
Если вы столкнулись с проблемой запуска Python-скрипта из PHP на сервере с настройками, подобными тем, которые вы описали (PHP 7.3, Python 3.8, CentOS 7, Apache 2.4), вы не одиноки. Эта ситуация может возникнуть по нескольким причинам, и в данной статье мы рассмотрим возможные источники проблем и их решения.
1. Структура и исходные ошибки кода
Для начала давайте проанализируем код. Вы используете функции exec
и escapeshellcmd
, что является хорошим подходом для повышения безопасности. Однако важно правильно выводить и обрабатывать результаты выполнения.
Возможный исправленный код будет выглядеть так:
<?php
error_reporting(E_ALL);
$command = 'python3 /home/uploads/testing.py';
$command = escapeshellcmd($command);
$shelloutput = shell_exec($command); // Попробуйте использовать shell_exec вместо exec()
$ret_code = null; // Инициализируем переменную для кода возврата
echo "<h1>";
echo htmlspecialchars($shelloutput); // Используйте htmlspecialchars для защиты от XSS
echo "</h1>";
?>
2. Проверка прав доступа
Вы правильно разместили файл скрипта и установили права доступа. Однако, убедитесь, что ваш скрипт имеет права на выполнение (например, 0755). Вы можете сделать это командой:
chmod 755 /home/uploads/testing.py
Также убедитесь, что папка, где расположен скрипт, имеет необходимые права доступа для пользователя, под которым работает сервер Apache (nobody
).
3. Исполнение через Apache
Когда вы запускаете PHP-скрипт через веб-сервер, он выполняется от имени пользователя Apache. Проверьте, что ваш Apache действительно работает под пользователем nobody
. Это можно сделать командой:
ps aux | grep apache
Если сервер работает с другим пользователем, нужно будет учитывать это в настройках прав доступа.
4. Обработка настроек PHP
Как показали ваши тесты, наличие директивы disable_functions
в файле php.ini
могло блокировать исполнение команд в оболочке. Убедитесь, что у вас нет ограничений, мешающих запуску командной строки:
- Откройте файл
php.ini
(обычно расположен в/etc/php.ini
или/etc/php/7.3/apache2/php.ini
). - Найдите строку с
disable_functions
и убедитесь, что она либо закомментирована, либо пуста:
disable_functions =
После изменения настроек не забудьте перезагрузить Apache:
sudo systemctl restart httpd
5. Логи и отладка
Если всё ещё возникают проблемы, обязательно проверьте логи Apache и PHP для получения дополнительной информации. Логи могут находиться в следующих местах:
/var/log/httpd/error_log
/var/log/php-fpm/error.log
Это поможет выявить, что именно мешает запуску.
Заключение
Запуск Python-скриптов из PHP может вызывать разнообразные проблемы, особенно если настройка сервера не оптимизирована. Важно правильно настраивать права доступа, корректно обрабатывать ошибки и следить за конфигурационными файлами. В вашей ситуации убедиться в чистоте конфигурации php.ini оказалось решающим шагом. Следуя указанным рекомендациям, вы сможете успешно запустить свои скрипты в интеграции с PHP.