我的情况:
我有一个由在后台运行的一些编译的C ++守护进程组成的软件,一个PHP / JS Web界面和一个用Python编写的CLI界面。目前,要从PHP(Web界面)向守护进程发送Dbus命令,我们使用python脚本代理调用,因为python具有非常成熟的Dbus实现。
我的问题:
有没有稳定的Dbus实现可以与PHP一起使用,与Ubuntu Server / CentOs兼容?
我尝试了什么:
- 未记录的测试版DBUS plugin in PECL仍处于测试阶段,并抱怨缺少X11环境(这对服务器有何影响?)。
- 然后有GREE php-dbus扩展未维护,链接到文档重定向到日本博客。
谢谢。
答案 0 :(得分:1)
在Web服务器(如Apache)上执行的PHP根本无法执行D-Bus请求。我试了好几天没有成功。这是因为网络服务器用户(如www-data
)无法通过dbus-daemon
联系人访问session
。
作为一种解决方法,我使用React内置HTTP server。完全像你,但都在PHP中。您的解决方法更加可靠。
答案 1 :(得分:0)
好吧,在Apache下执行的PHP 可以做到 D-Bus请求!
问题是D-Bus请求仅限于一个用户,也就是说,例如www-data用户可以向www-data拥有的进程发出请求,而不能向其他用户发出请求。
此限制是设计使然,并且可能还出于安全性的考虑:将不存在D-bus用户间通信!
您可以为用户www数据启动D-Bus服务器,例如
> sudo -u www-data sh -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/tmp/dbus-www-data && dbus-daemon --fork --session --print-address 1 --address='unix:path=/tmp/dbus-www-data'"
或类似。如果可行,您应该在/ tmp中看到类似
的管道srwxrwxrwx 1 www-data www-data 0 Aug 1 09:15 dbus-www-data=
由于www-data无法直接登录(没有sudo www-data),因此您需要在shell命令(-c)中执行,导出D-Bus会话地址(会话套接字/数据位于/ tmp / dbus- www-data,将在通话期间创建该数据),然后使用此D-bus地址启动dbus守护程序。
这在我的Apache2 / PHP / C ++设置中有效,但是由于使用了www-data用户,调试起来相当复杂。