
本文详解在离线 web 应用中通过 php 的 exec() 调用 xrandr 命令动态旋转 ubuntu 显示屏的关键要点,重点解决因 x11 显示会话上下文缺失导致命令静默失败的问题,并提供可落地的代码示例与安全实践建议。
在基于 XAMPP(Linux 版)构建的离线办公信息展示系统中,常需支持屏幕方向动态调整(如横屏/竖屏切换),以适配不同安装场景下的物理显示器。虽然 xrandr --output HDMI-1 --rotate left 在终端中可直接执行成功,但通过 PHP 的 exec() 调用却常无响应或报错——根本原因在于:PHP 进程(通常由 Apache 以 www-data 用户运行)默认无法访问当前用户的 X11 显示服务器会话。
X11 图形操作必须明确指定显示地址(如 :0.0),否则 xrandr 将因找不到有效 $DISPLAY 环境变量而失败。因此,正确写法需显式传入 -display :0.0 参数:
&1', $output, $returnCode); var_dump($returnCode, $output); // 调试用:检查返回码与错误输出 ?>
⚠️ 注意事项::0.0 是默认主显示编号,可通过 loginctl show-session $(loginctl | grep "session-" | awk '{print $1}') -p Type 或 echo $DISPLAY(在用户登录终端中执行)确认实际值;输出设备名需准确匹配:运行 xrandr --listoutputs 获取当前可用输出(如 HDMI-1、DP-1、eDP-1),避免硬编码错误;权限与环境隔离:Apache 进程默认无权访问用户 X session。推荐方案是:将 Web 服务用户(如 www-data)加入 video 和 render 用户组:sudo usermod -a -G video,render www-data配置 sudoers 允许免密执行特定 xrandr 命令(更安全):www-data ALL=(ALL) NOPASSWD: /usr/bin/xrandr -display :0.0 --output * --rotate * 对应 PHP 调用改为:exec('sudo /usr/bin/xrandr -display :0.0 --output HDMI-1 --rotate inverted 2>&1', $output, $returnCode);务必捕获错误输出(2>&1)并检查 $returnCode(0 表示成功),便于快速定位问题(如权限拒绝、输出不存在等);生产环境禁用 exec() 风险指令前,请确保已关闭 disable_functions 中的 exec,且 Web 目录无写入权限漏洞,防止远程命令注入。
总结:PHP 调用 xrandr 的核心在于显式声明 X11 显示上下文、精准匹配硬件输出名,并通过合理权限模型保障安全性。结合调试输出与最小权限原则,即可稳定支撑离线数字标牌类应用的屏幕方向管理需求。











