Linux终端正常的youtube-dl带cookies命令在PHP exec中失效求助
碰到这种终端里能正常跑,但PHP调用就出错的情况,我太熟悉了!核心问题基本都出在执行环境差异上——毕竟PHP是用web服务器的用户(比如www-data)来执行命令的,和你终端登录的用户完全不是一回事。咱们一步步排查解决:
1. 先把路径问题搞定!
这是最常见的坑:
- cookies文件要用绝对路径:PHP里的相对路径是基于web服务器的工作目录(比如
/var/www/html),不是你终端里的当前文件夹。把命令里的cookies.txt改成绝对路径,比如/home/your-username/cookies.txt。 - youtube-dl也要用绝对路径:终端里能直接敲
youtube-dl是因为它在系统PATH里,但PHP的执行环境PATH可能不一样。先在终端里跑which youtube-dl拿到它的绝对路径(比如/usr/local/bin/youtube-dl),然后在PHP命令里用这个完整路径。
修改后的PHP代码应该是这样(记得用escapeshellarg()转义URL,避免特殊字符搞砸命令):
$url = "https://www.youtube.com/watch?v=yIRBMRTb260"; // 替换成你自己的绝对路径 $youtubeDlPath = "/usr/local/bin/youtube-dl"; $cookiesPath = "/home/your-username/cookies.txt"; $command = "$youtubeDlPath --cookies $cookiesPath --get-url " . escapeshellarg($url); exec($command, $output, $returnCode); // 调试用:打印输出和返回码,看看具体问题 var_dump($output); var_dump($returnCode);
2. 给cookies文件设置正确的权限
web服务器用户(比如www-data)得能读取你的cookies文件才行:
- 先修改文件权限,让其他用户能读:
chmod 644 /home/your-username/cookies.txt - 如果还是不行,直接把文件所有权改成web服务器用户:
chown www-data:www-data /home/your-username/cookies.txt
3. 捕获完整的错误信息
默认情况下,exec只捕获命令的标准输出,错误信息会被丢掉。把命令改成这样,就能把错误输出也抓回来,方便排查:
$command = "$youtubeDlPath --cookies $cookiesPath --get-url " . escapeshellarg($url) . " 2>&1";
这样你就能看到比原来更详细的错误提示,比如是不是权限不够,或者路径找不到。
4. 检查PHP的安全限制
有些服务器会限制PHP执行外部命令:
- 打开
php.ini,检查disable_functions里有没有exec,如果有就去掉(操作前确保服务器安全)。 - 检查
open_basedir设置,确保你的cookies文件在它允许访问的目录范围内。
5. 最后确认cookie格式
youtube-dl只认Netscape格式的cookies文件,如果你是从浏览器导出的,要选对格式(比如Chrome导出时选“Netscape格式”,别选JSON)。不过你终端里能跑的话,格式应该没问题,但还是确认一下更稳妥。
内容的提问来源于stack exchange,提问作者skhmatin
相关产品推荐
相关产品推荐

