PHP Dbus 稳定实现
Posted
技术标签:
【中文标题】PHP Dbus 稳定实现【英文标题】:PHP Dbus stable implementation 【发布时间】:2013-12-11 09:19:39 【问题描述】:我的情况: 我有一个软件,它由一些在后台运行的已编译 C++ 守护程序、一个 php/JS Web 界面和一个用 Python 编写的 CLI 界面组成。目前,为了从 PHP(Web 界面)向守护进程发送 Dbus 命令,我们使用 Python 脚本来代理调用,因为 Python 具有非常成熟的 Dbus 实现。
我的问题: 有任何稳定的 Dbus 实现可以与 PHP 一起使用,与 Ubuntu Server/CentOs 兼容?
我尝试了什么: - 未记录的 beta DBUS plugin in PECL,仍处于测试阶段,并抱怨缺少 X11 envion(这对服务器有什么好处?)。 - 还有一个没有维护的GREE php-dbus 扩展,指向文档的链接重定向到日本博客。
谢谢。
【问题讨论】:
【参考方案1】:在 Web 服务器(如 Apache)上执行的 PHP 根本无法执行 D-Bus 请求。我尝试了几天没有成功。这是因为网络服务器用户(如www-data
)无法通过session
连接访问dbus-daemon
。
作为一种解决方法,我使用了React 内置HTTP server。和你一模一样,但都在 PHP 中。您的解决方法要可靠得多。
【讨论】:
【参考方案2】:嗯,在 Apache 下执行的 PHP 可以做 D-Bus 请求!
问题在于 D-Bus 请求仅限于单个用户,也就是说 www-data 用户可以向 www-data 拥有的进程发出请求,但不能向其他用户发出请求。
此限制是设计使然,也可能是出于安全考虑:不会有 D-bus 用户间通信!
您可以为用户 www-data 启动一个 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 用户,调试起来相当复杂。
【讨论】:
以上是关于PHP Dbus 稳定实现的主要内容,如果未能解决你的问题,请参考以下文章
全职远程,长期稳定招PHP.NetPython,OracleNODE Js技术大牛,PAQA