php - Dbus PHP 无法在没有 $DISPLAY 的情况下为 X11 启动 dbus-daemon

标签 php dbus

我正在使用 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);

当我的代码运行时出现以下错误:

Warning: dbus_bus_get() [function.dbus-bus-get]: failed to create dbus connection object [Unable to autolaunch a dbus-daemon without a $DISPLAY for X11] in [...COI/GTK/Notify.php on line 39

这是我第一次使用与 dbus 相关的任何东西,而且很迷茫。

我的目标是实现类似于在终端(在 Ubuntu 11.10 上)中执行以下命令时发生的效果:

/usr/bin/notify-send -t 2000 'title' 'message'

我最初使用的是 notify-sendexec,但当我发现 GREE Dbus 扩展时切换了,因为我认为它可以提供更清晰的界面。此外,notify-send 只有在我将我的 apache 用户更改为与我当前登录的用户相同时才能正常工作 - 这不是理想的解决方案。

谁能告诉我需要进行哪些修改才能达到我想要的结果,或者告诉我我想做的事情是否实际上是不可能的?

或者,还有其他方法吗?

最佳答案

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 无法在没有 $DISPLAY 的情况下为 X11 启动 dbus-daemon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8556777/

相关文章:

php - 我需要一些有关在 codeigniter 中使用 session 的帮助

javascript - 在下拉列表中显示数组

c++ - 这个 Qt DBus 信号连接代码是否正确?

python - 如何通过 python 和 dbus 创建 systemd transient 计时器和服务(类似于 systemd-run)?

php - 通过减去乘数并使用 where 来更新查询

php - PHP 沙箱的安全问题

php - 所有编辑和添加都必须得到指定管理员/经理的批准

java - 如何使用 dbus 和 NetworkManager 激活连接

elasticsearch - Docker centos7 systemctl deos无法正常工作:无法连接D-bus

dbus - 带数组的 Systemd dbus sd_bus_call_method()