
本文详解如何在基于 xampp 的离线 web 应用中,通过 php 的 `exec()` 函数正确调用 `xrandr` 实现屏幕旋转,并解决因环境上下文缺失导致的命令失效问题。
在 Ubuntu 离线办公显示系统中,使用 PHP 控制屏幕方向是一项实用但易出错的需求。你尝试的 exec('xrandr --output HDMI-1 --rotate left') 在终端中能成功执行,却在 PHP 中静默失败——根本原因在于:PHP 进程(通常由 Apache 或 XAMPP 的 httpd 启动)运行在无图形会话的独立用户上下文中,无法自动识别当前 X11 显示服务器(如 :0.0)及对应的权限环境。
要使 xrandr 正常工作,必须显式指定显示目标,并确保执行用户具备访问 X Server 的权限。修正后的代码如下:
&1", $outputLines, $returnCode);
// 检查执行结果
if ($returnCode === 0) {
echo "✅ 屏幕已成功旋转为 {$rotate} 方向";
} else {
echo "❌ 执行失败(返回码 {$returnCode}):". implode("\n", $outputLines);
}
?>⚠️ 关键注意事项:
- DISPLAY 必须准确匹配当前 X 会话:运行 echo $DISPLAY(在桌面终端中)确认值(通常是 :0.0 或 :1),不可硬编码为 :0(缺少小数点);
-
Apache/XAMPP 用户需有 X 权限:默认 www-data(Ubuntu Apache)或 daemon(XAMPP)用户无权访问图形会话。需执行以下任一方案:
- ✅ 推荐:将 Web 服务用户加入 video 组并授权 X 访问:
sudo usermod -a -G video www-data xhost +SI:localuser:www-data # 临时授权(重启后失效)
- ✅ 更安全方案:改用 sudo 并配置免密规则(仅限可信离线环境):
# 编辑 /etc/sudoers(用 visudo) www-data ALL=(ALL) NOPASSWD: /usr/bin/xrandr # PHP 中调用: exec("sudo /usr/bin/xrandr --output HDMI-1 --rotate left");
- ✅ 推荐:将 Web 服务用户加入 video 组并授权 X 访问:
- 输出设备名需动态检测:HDMI-1 因硬件而异,建议先用 xrandr --query | grep " connected" 获取真实连接的输出名称;
- 避免直接暴露控制接口:离线应用也应添加简单鉴权(如 URL 参数 token 或 Session 验证),防止误触或恶意调用。
总结:PHP 调用图形命令的核心是「补全执行环境」——明确 DISPLAY、确保权限、验证设备名。只要正确配置上下文,xrandr 即可成为可靠、轻量的屏幕管理工具,完美适配数字标牌、信息看板等离线展示场景。
立即学习“PHP免费学习笔记(深入)”;











