Однако PHP просто не выдает никаких выходных данных. Для сообщения об ошибках установлено значение E_ALL, а функция display_errors включена.
Вот что я пробовал:
Я использовал python2, /usr/bin/python2 и python2.7 вместо /usr/bin/python2.7
Я также использовал относительный путь вместо абсолютного, что тоже ничего не изменило.
Я пробовал использовать команды exec, shell_exec, system.
Однако, если я запущу
if (exec('echo TEST') == 'TEST') { echo'exec works!'; }
он отлично работает, пока shutdown now ничего не делает.
У PHP есть разрешения на доступ к файлу и его выполнение.
РЕДАКТИРОВАТЬ: Благодаря Алехандро, я смог устранить проблему. Если у вас такая же проблема, не забывайте, что ваш веб-сервер, вероятно / надеюсь, не запускается от имени root. Попробуйте войти в систему как пользователь вашего веб-сервера или пользователь с аналогичными разрешениями и попробуйте выполнить команды самостоятельно.
Переведено автоматически
Ответ 1
Протестировано на Ubuntu Server 10.04. Надеюсь, это поможет вам и в Arch Linux.
Если у вас установлено несколько версий Python, /usr/ bin /env будет гарантировать, что используемый интерпретатор является первым в вашей среде $PATH . Альтернативой было бы жестко запрограммировать что-то вроде #!/usr/bin/python; это нормально, но менее гибко.
В Unix исполняемый файл, предназначенный для интерпретации, может указывать, какой интерпретатор использовать, имея #! в начале первой строки, за которым следует интерпретатор (и любые флаги, которые ему могут понадобиться).
Если вы говорите о других платформах, конечно, это правило неприменимо (но эта "шаблонная строка" не причиняет вреда и поможет, если вы когда-нибудь скопируете этот скрипт на платформу с базой Unix, такую как Linux, Mac и т.д.).
Это применимо, когда вы запускаете его в Unix, делая его исполняемым (chmod + x myscript.py), а затем запускаете его напрямую : ./myscript.py , а не только python myscript.py
Также файл Python должен иметь правильные привилегии (выполнение для пользователя www-data / apache, если PHP-скрипт запускается в браузере или curl) и / или должен быть "исполняемым". Также все команды в .py файле должны иметь правильные привилегии.
Просто краткое напоминание для тех, кто пытается использовать shell_exec на платформе типа unix и, похоже, не может заставить его работать. PHP выполняется в системе от имени веб-пользователя (обычно www для Apache), поэтому вам нужно убедиться, что веб-пользователь имеет права на любые файлы или каталоги, которые вы пытаетесь использовать в команде shell_exec. В остальном, похоже, что он ничего не делает.
Ответ 2
Я рекомендую использовать passthru и обрабатывать выходной буфер напрямую:
Если вы хотите узнать состояние возврата команды и получить весь stdout вывод, который вы можете на самом деле использовать exec:
$command = 'ls'; exec($command, $out, $status);
$out это массив всех строк. $status это состояние возврата. Очень полезно для отладки.
Если вы также хотите увидеть stderr результат, вы можете либо поиграть с proc_open, либо просто добавить 2>&1 в свой $command. Последнего часто бывает достаточно, чтобы заставить все работать и намного быстрее "реализовать".
Ответ 4
Чтобы уточнить, какую команду использовать в зависимости от ситуации
exec() - Выполнить внешнюю программу
system() - Выполнить внешнюю программу и отобразить выходные данные
passthru() - Выполнение внешней программы и отображение необработанных выходных данных