Невозможно запустить скрипт Python из PHP

Вопрос или проблема

Этот вопрос задавался так много раз с отличными предложениями, но внезапное исчезновение спрашивающих действительно не помогает, так как они никогда не возвращаются, чтобы сказать, что сработало (предполагая, что это должно было сработать в конце концов)

Я пытаюсь запустить скрипт на 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 могло блокировать исполнение команд в оболочке. Убедитесь, что у вас нет ограничений, мешающих запуску командной строки:

  1. Откройте файл php.ini (обычно расположен в /etc/php.ini или /etc/php/7.3/apache2/php.ini).
  2. Найдите строку с 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.

Оцените материал
Добавить комментарий

Капча загружается...