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');