php - 来自另一个用户的 DBus

我正在尝试从 PHP 程序连接到 DBus。

当我从命令行运行该程序时,它可以工作,但是当它由 Apache 网络服务器(以用户 apache 身份运行)运行时,它无法连接到总线。

我尝试了使用 system 调用 qdbus 和使用 python-dbus 调用 Python 脚本,但是这两种方式都不起作用。另外,我无法编译 this PHP extension ,但我认为这不会解决我的问题。

我认为问题在于提供 session 总线的 DBus 守护程序以我的用户身份运行(系统总线一以 messagebus 身份运行),但 PHP 以 apache.

如何连接到其他用户的总线?

(This 对我不起作用。)

最佳答案

首先,您是否有尝试调用的 dbus 方法? Dbus 只是传输层,您需要一个托管 dbus 方法的程序和一个调用 dbus 方法的程序。我假设您有一个要从 php 程序调用的 dbus 方法。

apache 如何尝试调用您的 dbus 方法?如果您使用 system() 方法或来自 php 的类似方法来调用 qdbus,那将会失败。 PHP 由 apache 运行,apache 没有像您的用户那样的自动登录 dbus 进程,也没有 X11 访问权限。这意味着为了让你的 apache 有 dbus,你必须使用:

eval 'dbus-launch --auto-syntax' [command]

当使用 PHP 的 system() 时。但这不是最佳选择。

一些解决方案是:

  1. 以您的用户身份运行 apache。
  2. 在系统总线上运行 dbus 并公开方法并允许 apache 从 dbus 配置文件中调用它们。这需要根访问权限,这会使事情复杂化。
  3. 研究向其他用户公开 session dbus 方法是否有效。最好应该有一个可以使用的 dbus-php 库。我很确定只要 apache 可以调用 dbus 方法,在 dbus 配置文件夹中有一个 xml 文件公开它就可以工作。

https://stackoverflow.com/questions/12123668/

相关文章:

html - 关闭浏览器后保存 HTML5 SessionStorage

java - 如何在 MyBatis 中调用返回 Oracle 记录类型的 Oracle 函数

html - 在新选项卡中打开链接(在框架设置内)

oop - 接口(interface)(替代多重继承)如何实现代码重用

text - 删除属于其他字符串的子字符串

arm - AOSP 中的工具链

php - session 提前结束

asp.net-mvc-3 - 如何将Web应用程序转换为SaaS?

asynchronous - 如果它不存在,如何让nginx重试静态文件

wpf - UnhandledExceptionFilter 捕获所有异常但只重新抛出一些异常