PHP не выполняется с веб-страницы [но отлично от PHP-CLI] на Raspberry Pi
настройка:
- Малина Pi
- веб-сервер nginx
- PHP5 & PHP-CLI установлен
мой скрипт Python "lights.py" это действительно круто, потому что он включает/выключает свет в моей гостиной через реле, подключенное к Arduino Uno [затем подключается к Pi через USB]. Я знаю, что мог бы использовать штыри GPIO Pi, я просто не сделал. Здесь это не имеет значения.
Я хотел иметь возможность активировать скрипт из интернета браузер через сайт, размещенный моим Pi, поэтому у меня есть /var/wwww/test / lights.php, содержащий этот код:
<?php
exec('python lights.py');
?>
просто, нет? Ну, когда я просматриваю эту страницу в браузере, ничего не появляется (ожидается), но огни не изменяют состояние (неожиданно). , в командной строке, вошел в систему как пользователь Pi, я могу запустить " php/var/wwww/test / lights.php " и он работает просто отлично!
Я полагаю, это потому, что nginx, похоже, использует этого пользователя под названием www-data материал, так что, может быть, это проблема разрешений? Теперь я блуждаю по неизвестной территории ... Я попробовал "su-www-data", чтобы узнать, могу ли я попробовать скрипт как этот пользователь, но он запрашивает пароль, который я никогда не настраивал (и пустой пароль не работал).
любая помощь с благодарностью.
обновление - здесь есть "ЛС-Ла-файле /var/www в/испытания/света*"
-rw-r--r-- 1 www-data root 37 Feb 1 23:56 /var/www/test/lights.php
-rwxr-xr-x 1 www-data root 129 Feb 1 23:51 /var/www/test/lights.py
ВТОРОЕ ОБНОВЛЕНИЕ - проверить это:
pi@raspberrypi ~ $ sudo su - www-data
$ pwd
/var/www
$ php ./test/lights.php
python: can't open file 'lights.py': [Errno 2] No such file or directory
$ python ./test/lights.py
Traceback (most recent call last):
File "./test/lights.py", line 4, in <module>
ser = serial.Serial('/dev/ttyACM0', 9600)
File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 260, in __init__
self.open()
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 276, in open
raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
что устройство "/dev/ttyACM0"-это мое соединение Arduino, поэтому у пользователя "www-data" нет доступа для запуска этого скрипта Python, так как он не может выводить в этот файл. Могу ли я "chmod" это устройство?
ТРЕТЬЕ ОБНОВЛЕНИЕ - я чувствую, что мы почти в конце!
используя "ls-g /dev/ttyACM0", я обнаружил, что он принадлежит группе "dialout."Используя" grep dialout /etc / group", я обнаружил, что ему назначен только пользователь "Pi". Поэтому я добавил www-data в эту группу с "usermod-A-G dialout www-data"
теперь проверить это:
pi@raspberrypi ~ $ sudo su - www-data
$ cd test
$ php lights.php
$ python lights.py
$
оба скрипта PHP и Python работают, и свет включался и выключался! но загрузка веб-страницы " огни.php " из браузера по-прежнему ничего не делает!
ЧЕТВЕРТОЕ ОБНОВЛЕНИЕ Я изменил файл PHP на это:
<?php
exec('python lights.py', $output, $return);
print "Output:";
print $output;
print "<br />";
print "Return:";
print $return;
?>
из того, что я собрал, это правильный способ получить некоторую отладочную информацию из оператора exec (). Вот результат, когда я обновляю страницы:
Output:Array
Return:1
это мне хоть как-то помогает?
5 ответов
PHP, вероятно, настроен для работы в безопасный режим в конфигурации сайта. При работе в безопасном режиме некоторые функции, такие как exec
инвалидов. Попробуйте отключить безопасный режим.
другая возможность заключается в том, что скрипт lights.py
не удается найти в каталоге, где работает ваш веб-сервер. Чтобы решить эту проблему, используйте полный путь к скрипту, например exec("/usr/bin/python /home/armani/lights.py")
.
другая возможность заключается в том, что веб-сервер работает как другой пользователь, как вы когда вы вошли в систему (возможно, как nouser
). И этот пользователь может не иметь доступа к некоторым ресурсам.
и, вероятно, есть еще много таких возможных ошибок. Пожалуйста, предоставьте дополнительную информацию об ошибке (попробуйте включить отладку в PHP, чтобы получить обратную трассировку).
ни один из ответов помог мне... на самом деле, мои обновления для моих сообщений регистрируют то, что было в конечном итоге ответом, который я нашел через свои собственные проб/ошибок и Googling.
Мне нужно было назначить пользователя www-data в группу dialout, чтобы иметь доступ к /dev / ACM0, и требовалась перезагрузка (всего сервера, а не только nginx по какой-то причине).
Я не знаю, почему все продолжали отвечать, что это проблема пути, когда я продолжал говорить, что скрипт PYTHON работает нормально ИЗ ОБОЛОЧКИ, И ФАЙЛ PHP РАБОТАЛ НОРМАЛЬНО ИЗ PHP-CLI.
во всяком случае, это то, что решило его в конце. Спасибо всем за попытку.
что такое chmod вашего lights.py файл ? Не могли бы вы попробовать команду followind ?
chmod +x lights.py
пожалуйста, проверьте правильность ваших путей, скрипт php будет запущен из каталога/var/wwww / test. Это lights.py файл также находится в этом каталоге? Если нет, укажите полный путь к файлу
вам нужно будет проверить, какой из них является текущим рабочим каталогом, и если это не тот, который вы хотите изменить, или даже проще просто выполнить с python скрипт с полным путем
exec ('python /var/www/test/lights.py');