【问题标题】:PHP from commandline starts gui programs but apache doesn'tPHP从命令行启动gui程序但apache没有
【发布时间】:2011-09-04 18:45:57
【问题描述】:

首先,我阅读了一些有类似问题的人的帖子,但所有答案都没有超出 export DISPLAY=:0.0 和 xauth cookie 的范围。所以这是我的问题,提前感谢您的时间!

我开发了一个使用 OpenGL 和 GLSL 渲染货架的小库。 前几天我把它封装在一个 php 扩展中,现在它运行起来非常简单。

但问题是它仅在我使用命令行扩展名执行 php 脚本时才有效 $php r100.php(我成功地从 http 用户运行它)。该脚本位于 apache 的 webroot 中,如果我从浏览器请求它,我会在 apache 的 error_log 中得到 ** CRITICAL **: Unable to open display

所以,为了让测试更容易,并确保问题不在库/扩展中,目前我只想使用以下 php 脚本启动 xmms。 <?php echo shell_exec("xmms"); ?> 它也只能在 shell 中工作。

我已经玩了太多 apache 配置了,以至于我真的不知道该尝试什么。 我试过$xhost + &amp;&amp; export DISPLAY=:0.0

在 http.conf 我有这些 SetEnv DISPLAY :0.0SetEnv XAUTHORITY /home/OpenGL/.Xauthority

所以我的问题似乎是这样的: 如何让 apache 以 http 用户拥有的所有权限(包括环境)执行 php 脚本?

附加信息: HTTP 在 vi​​deo 和 users 组中,并且有一个登录 shell(bash)。 我可以以 http 身份登录并毫无问题地执行脚本,并且可以运行显示在显示器 0 上的 GUI 程序。 看来apache没有为脚本提供合适的环境。 我读到了 CLI/CGI 之间的一些区别,但也不能用 php-cgi 运行 xmms...

有其他配置的想法吗?

问候

【问题讨论】:

    标签: php linux apache


    【解决方案1】:

    听起来有点危险,但基本上您甚至可以将 export DISPLAY=:0.0 添加到 apache 启动脚本(如在 Linux /etc/init.d/httpd 或 apache 依赖发行版中)。 并且“xhost +”需要在以用户身份连接到本地 X 服务器的帐户上运行,尽管我只是想知道它将如何工作,因为 php 脚本应该只在 apache http 请求正在进行时才存在。

    编辑: 这是一种应用程序启动器吗?,您可以使用 exec("nohub /usr/bin/php script.php &"); .. 现在应该释放 apache 并且 php 应该继续在后台工作。

    【讨论】:

    • 这是真正的答案,实际上我将 export DISPLAY=:0 添加到 /etc/environment。 xauth 只是安全问题,我将使用它,但 env var 是我的问题 :)
    • 对你的最后一个问题,不,它不是应用程序启动器,在我开发的库中调用函数的扩展中。
    • @NaydenDochev 我只是想弄清楚你是如何设法运行这些的,因为通常任何 php(带有 apache)函数只在请求进行时才有效。当然,一种方法是启动到后台并将 pid 存储到“kill”命令的某个地方。或者在 apache 运行时扩展是否存在?无论如何,很高兴你找到了解决方案:)
    • 嗨,如果您查看 zend 扩展指南,会更容易澄清,但不,扩展不与 apache 一起使用,但无论如何都可以将任何内容存储在会话中。我使用图书馆的方式,与实时桌面应用程序无关,它只是根据尺寸和材料单次绘制。我把它变成了一个 php 扩展而不是命令行工具(更简单、更干净的方法)只是因为这是我被要求做的 :)
    【解决方案2】:

    在您的控制台中,允许所有人使用 X 服务器:

    xhost +
    

    在您的 PHP 脚本中,在执行命令时设置 DISPLAY 变量:

    DISPLAY=:0 glxgears 2>&1
    

    【讨论】:

    • 不要做xhost +。这是完全不安全的。看这里:lugod.org/pipermail/vox-tech/2005-March/010864.html
    • 好的,这行得通,现在我需要考虑如何在使用扩展程序中的函数时也使其工作。谢谢!
    • @ceving,即使在xhost + 之后,我的 X11 似乎也没有在任何接口上监听。你会建议什么而不是 xhost +
    • @arnaud576875 如果您希望 X 服务器侦听端口,则必须启用 TCP。见这里:unixtutorial.org/2007/08/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多