You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过PHP Exec远程调用Linux服务器MPV播放视频的权限问题

解决www-data用户通过PHP exec运行MPV无法播放视频的问题

我来帮你拆解下这个问题——核心是www-data用户没有访问X11显示会话的权限,再加上目录权限的小问题,咱们一步步来搞定:

1. 给www-data授权访问X11显示

root能正常播放是因为它默认拥有X11会话的访问权限,而www-data作为网页服务用户,默认是没有这个权限的,这也是报错里couldn't open the X11 display (:1)!的原因。

  • 临时授权:在root的终端里执行这个命令,允许www-data连接到当前的X11会话:
    xhost +SI:localuser:www-data
    
  • 永久生效:如果需要每次X11启动都自动授权,把上面的命令添加到root用户的.xprofile文件里(或者你用的桌面环境的启动脚本),这样每次登录图形界面都会自动给www-data开权限。
  • 注意:先确认你的DISPLAY=:1是正确的——在root终端里运行echo $DISPLAY,有时候显示号可能是:0,要和PHP脚本里的保持一致。

2. 修复目录权限问题

报错里的Home directory not accessible: Permission denied和pulseaudio配置文件权限错误,是因为MPV或pulseaudio尝试访问了root的家目录,或者www-data自己的家目录权限不对:

  • 检查www-data的家目录权限:默认是/var/www,执行下面的命令确保www-data拥有读写执行权限:
    chown -R www-data:www-data /var/www
    chmod 700 /var/www
    
  • 给www-data创建专属的pulseaudio配置目录,避免它去读root的配置:
    mkdir -p /var/www/.config/pulse
    chown www-data:www-data /var/www/.config/pulse
    

3. 调整MPV的视频输出驱动(可选)

如果授权X11后还是出现视频设备初始化错误,可以尝试指定MPV用更通用的X11视频输出驱动,修改你的PHP代码:

$cmd = "DISPLAY=:1 mpv video/test.mp4 --ao=alsa:device=[hw:1] --vo=x11";
$out = shell_exec($cmd);

也可以试试--vo=xv,不同的硬件可能适配不同的驱动。

4. 先在命令行测试验证

在调整PHP脚本之前,先切换到www-data用户测试命令是否正常,排除PHP环境的干扰:

su - www-data -s /bin/bash
DISPLAY=:1 mpv video/test.mp4 --ao=alsa:device=[hw:1]

如果命令行下能正常播放视频,那PHP脚本执行也应该没问题了。

内容的提问来源于stack exchange,提问作者Sevon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:03:37