Ubuntu(XAMPP环境)下通过PHP Exec调用xrandr实现屏幕旋转失败的问题排查
这个问题我之前也碰到过!核心原因是XAMPP里的Apache服务运行的用户和你在终端操作的用户不是同一个,而且X11(Ubuntu的图形系统)默认只允许当前登录用户访问显示设备,所以PHP脚本调用xrandr的时候拿不到必要的权限和环境变量。下面是一步步的解决思路:
1. 先排查错误信息
首先别盲目试命令,先让PHP输出执行xrandr时的错误日志,这样能精准定位问题。把你的代码改成这样:
<?php // 把错误输出重定向到标准输出,方便捕获 exec('xrandr --output HDMI-1 --rotate left 2>&1', $output, $returnCode); echo "返回码: " . $returnCode . "<br>"; echo "输出信息:<br>"; foreach($output as $line) { echo $line . "<br>"; } ?>
访问这个PHP页面后,你大概率会看到类似Can't open display的错误,这就确认是X11权限的问题了。
2. 临时授权Apache用户访问X显示
Ubuntu里XAMPP的Apache通常以www-data或nobody用户运行,先确认一下:
在终端执行ps aux | grep apache,找到Apache进程对应的用户(比如第一列的用户名)。
假设是www-data,在终端执行以下命令,临时允许该用户访问当前的X显示:
xhost +local:www-data
之后再刷新PHP页面,应该就能看到xrandr生效了!不过这个设置是临时的,重启机器后会失效,接下来看永久解决方案。
3. 永久配置X11权限
方法一:在启动脚本中添加xhost授权
编辑用户的启动脚本(比如~/.bashrc或者~/.profile),添加一行:
xhost +local:www-data
这样每次登录系统时,都会自动授权www-data访问X显示。
方法二:给Apache设置环境变量
编辑XAMPP的Apache配置文件(通常在/opt/lampp/etc/httpd.conf),在文件末尾添加:
SetEnv DISPLAY :0 SetEnv XAUTHORITY /home/你的用户名/.Xauthority
注意把/home/你的用户名/.Xauthority换成你实际的用户路径,这个文件是X11的授权文件,需要确保Apache用户(www-data)有读取权限:
sudo chmod o+r /home/你的用户名/.Xauthority
重启Apache服务(sudo /opt/lampp/apachectl restart),之后PHP脚本就能稳定调用xrandr了。
4. 注意安全风险
如果上面的方法还是不行,有人会建议给www-data添加sudo权限执行xrandr,但非常不推荐——哪怕是离线应用,给Web服务器用户sudo权限都有极大的安全隐患。除非你完全确定没有任何外部访问的可能,否则尽量不用这个方案。如果真的要试,编辑sudoers文件:
sudo visudo
添加一行:
www-data ALL=(ALL) NOPASSWD: /usr/bin/xrandr
然后PHP里的命令改成sudo xrandr ...,但一定要谨慎!
内容的提问来源于stack exchange,提问作者JGUK

