我正在尝试使用 GREE Labs' Dbus PHP Extension 来创建一个能够创建桌面通知的 PHP 类。
$dbus = $dbus = dbus_bus_get(DBUS_BUS_SESSION);
$message = new \DBusMessage(DBUS_MESSAGE_TYPE_SIGNAL);
$message->setDestination("org.freedesktop.DBus");
$message->setAutoStart(true);
$dbus->sendWithReplyAndBlock($message, 1);
当我的代码运行时,我收到以下错误:
这是我第一次使用与 dbus 相关的任何东西,我很迷茫。
我的目标是类似于在终端(在 Ubuntu 11.10 上)执行以下内容时发生的效果:
/usr/bin/notify-send -t 2000 'title' 'message'
我最初确实使用了
notify-send
和 exec
,但是当我发现 GREE Dbus 扩展时切换了,因为我认为它可以提供更清晰的界面。此外,只有将 apache 用户更改为与我当前登录的用户相同时,notify-send
才能正常工作 - 不是理想的解决方案。谁能告诉我需要进行哪些修改才能达到我想要的结果,或者告诉我我想做的事情实际上是不可能的?
或者,还有另一种方法我应该这样做吗?
最佳答案
Dbus 执行 而不是 就像在命令行环境中运行时一样,没有 X。这令人沮丧,但这是我在 python 中编写的内容来覆盖它。归结为设置两个环境变量。
def run(self):
os.environ['DBUS_SESSION_BUS_ADDRESS'] = "unix:path=/run/dbus/system_bus_socket"
os.environ["DISPLAY"] = ":0"
try:
bus_name = dbus.service.BusName(INTERFACE,
bus = dbus.SessionBus())
dbus.service.Object.__init__(self, bus_name,
'/com/your/path/here')
gobject.MainLoop().run()
except Exception, E:
f = file('/tmp/bus.log', 'a')
f.write(str(E))
f.close()
编辑:我忘记了另一种在命令行上运行 dbus 的非常有用的方法
eval 'dbus-launch --auto-syntax' [command]
我在树莓派上使用它来运行我的自定义 dbus 守护进程。
dbus-launch --auto-syntax
是在bash中输出适用于dbus的环境变量和文件的命令。 eval
命令将获取该输出并对其进行评估,以便您的 command
将使用这些环境变量运行。一个简单的测试是运行这样的:
eval 'dbus-launch --auto-syntax' python /usr/bin/my-dbus-daemon.py
eval 'dbus-launch --auto-syntax' qdbus org.dbus.method /org/dbus/method/test
关于php - Dbus PHP 无法在没有 X11 的 $DISPLAY 的情况下启动 dbus-daemon,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8556777/