
本文详解为何 `exec('xrandr --output hdmi-1 --rotate left')` 在 php 中失效,并提供正确用法:显式指定 x display(如 `:0.0`)、确保权限与环境一致性,以及安全调用的关键实践。
在基于 Ubuntu 的离线办公显示系统中,通过 Web 界面动态调整屏幕方向(如横屏/竖屏/翻转)是一项实用需求。然而,直接在 PHP 中调用 xrandr 命令(例如 exec('xrandr --output HDMI-1 --rotate left'))往往静默失败——尽管该命令在终端中可正常运行。根本原因在于:PHP 进程(通常由 Apache 或 PHP-FPM 以 www-data 用户身份运行)并未连接到当前用户的 X Server 会话,缺少必要的显示上下文(DISPLAY 环境变量)和访问权限。
要使 xrandr 在 PHP 中生效,必须显式指定目标 X 显示器地址(通常是 :0.0),并确保执行环境具备访问权限。以下是经过验证的正确调用方式:
&1', $output, $returnCode);
if ($returnCode === 0) {
echo "屏幕已成功向左旋转";
} else {
error_log("xrandr 执行失败(返回码 {$returnCode}):". implode("\n", $output));
echo "旋转失败,请检查日志";
}
?>⚠️ 关键注意事项:DISPLAY=:0.0 必须前置:不能仅依赖 -display :0.0 参数(部分旧版 xrandr 不支持),环境变量方式更可靠;确认输出接口名:使用 exec('DISPLAY=:0.0 xrandr --listoutputs', $outputs) 动态获取有效输出名(如 HDMI-1、eDP-1 或 DP-1),避免硬编码错误;权限配置:需将 www-data 用户加入 video 组(sudo usermod -a -G video www-data),并确保其能访问 /dev/dri/ 和 X11 socket(通常位于 /tmp/.X11-unix/X0);安全限制:生产环境中禁用 exec() 存在风险,建议结合 CSRF 保护、白名单参数校验及最小权限原则;若部署于 Kiosk 模式,可考虑改用 systemd service + socket 激活方式解耦权限;X Server 会话绑定:确保 XAMPP(或 Apache)启动时,X Server 已由同一用户(如 ubuntu)登录并保持活跃——无人值守时可使用 x11vnc 或 systemd --user 服务维持会话。
综上,PHP 调用 xrandr 并非不可行,而是需精准匹配 X11 环境上下文。通过显式设置 DISPLAY、验证输出设备、合理配置权限并辅以错误处理,即可构建稳定可靠的屏幕方向控制能力,满足离线数字标牌等场景的核心需求。











