从PHP调用Puppeteer遇EACCES权限错误,求解决方案
Puppeteer 权限错误(EACCES: permission denied)解决方案
问题根源
你遇到的EACCES: permission denied, stat '/root/.config/puppeteer'错误,核心原因是PHP的exec函数默认以www-data用户运行,而/root目录权限通常为700,仅允许root用户访问——哪怕你修改了/root/.config/puppeteer的权限和所有者,www-data连进入/root目录的权限都没有,所以修改子文件夹完全无效。
有效解决方案
方案1:在Node脚本前置设置环境变量
确保在引入puppeteer之前就指定所有相关环境变量,让Puppeteer直接使用www-data有权限的目录:
// 必须放在require('puppeteer')之前 process.env.PUPPETEER_CONFIG = '/var/www/.puppeteer/config'; process.env.PUPPETEER_CACHE_DIR = '/var/www/.puppeteer/cache'; process.env.PUPPETEER_USER_DATA_DIR = '/var/www/.puppeteer/user-data'; const puppeteer = require('puppeteer'); // 后续你的Puppeteer代码
然后创建对应目录并设置权限:
mkdir -p /var/www/.puppeteer/{config,cache,user-data} chown -R www-data:www-data /var/www/.puppeteer chmod -R 755 /var/www/.puppeteer
方案2:在PHP exec命令中直接传递环境变量
如果不想修改Node脚本,可在执行命令时直接注入环境变量,强制Puppeteer使用指定路径:
exec('PUPPETEER_CONFIG=/var/www/.puppeteer/config PUPPETEER_CACHE_DIR=/var/www/.puppeteer/cache PUPPETEER_USER_DATA_DIR=/var/www/.puppeteer/user-data node your-puppeteer-script.js', $output, $return_var);
同样需要先创建目录并设置权限(同方案1的bash命令)。
方案3:修改www-data的HOME环境变量
让Puppeteer默认使用www-data的家目录而非root的,只需在exec中设置HOME变量:
exec('HOME=/var/www node your-puppeteer-script.js', $output, $return_var);
然后创建默认配置目录:
mkdir -p /var/www/.config/puppeteer chown -R www-data:www-data /var/www/.config chmod -R 755 /var/www/.config
这样Puppeteer会自动读取/var/www/.config/puppeteer,无需额外设置其他环境变量。
内容的提问来源于stack exchange,提问作者Mo El
相关产品推荐
相关产品推荐

