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语言描述|保障服务稳定之服务限流算法

全职远程,长期稳定招PHP.NetPython,OracleNODE Js技术大牛,PAQA

最稳定的Nginx绿色环境,可无限自定义PHP和mysql版本同时运行N个版本

对话YAO.Cash: 如何实现跨链稳定币高效稳定?

Redis+PHP秒杀设计

phpstudy创建的sql稳定性好吗