我正试图从PHP程序连接到DBus。
当我从命令行运行程序时,它可以工作,但当它由Apache Web服务器运行(以用户apache
的身份运行)时,它无法连接到总线。
我尝试过用system
调用qdbus
,也尝试过用Python-dbus调用Python脚本,但这两种方法都不起作用。此外,我无法编译这个PHP扩展,但我认为它不会解决我的问题。
我认为问题在于,提供会话总线的DBus守护进程以我的用户身份运行(系统总线以messagebus
运行),但PHP以apache
运行。
如何连接到其他用户的总线?
(这对我不起作用。)
首先,您有要调用的dbus方法吗?Dbus只是一个传输层,您需要一个承载Dbus方法的程序和一个调用dbu方法的程序。我假设您有一个想要从php程序调用的dbus方法。
apache是如何尝试调用您的dbus方法的?如果您使用php中的system()方法或类似方法来调用qdbus,则会失败。PHP由apache运行,apache没有像用户那样的自动登录dbus进程,也没有X11访问权限。这意味着为了让您的apache拥有dbus,您必须使用:
eval 'dbus-launch --auto-syntax' [command]
当使用PHP的system()时。不过,这并不是最佳选择。
一些解决方案是:
- 以用户身份运行apache
- 在系统总线上运行dbus,公开这些方法,并允许apache从dbus配置文件中调用它们。这需要root访问权限,这可能会使问题复杂化
- 研究向其他用户公开会话dbus方法是否有效。最好应该有一个可以使用的dbusphp库。我非常确信,只要apache可以调用dbus方法,那么在dbus-config文件夹中有一个xml文件来公开它就可以了