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

通过PHP调用Python Selenium脚本失败(www-data用户权限问题)

解决方案:PHP以www-data身份执行Selenium脚本失败问题

核心问题分析

www-data作为受限系统用户,没有访问/root目录的权限,且Chrome在无头模式下运行需要额外的权限配置,这是导致Session创建失败、DevToolsActivePort文件不存在的主要原因。


1. 修复用户数据目录权限

你的Chrome配置中指定了--user-data-dir=/root/www-temp,www-data无法访问/root目录,必须替换为有权限的目录:

  • 创建专属目录并设置权限:
    sudo mkdir -p /var/www/chrome-profile
    sudo chown -R www-data:www-data /var/www/chrome-profile
    
  • 修改Python脚本中的参数:
    chrome_options.add_argument('--user-data-dir=/var/www/chrome-profile')
    chrome_options.add_argument('--profile-directory=Default')  # 使用默认子目录,确保权限正确
    

2. 优化Chrome启动参数

针对受限用户,补充并调整参数以提升稳定性:

chrome_options = Options()
chrome_options.binary_location = '/usr/bin/google-chrome-stable'
chrome_options.add_argument('--headless=new')  # 新版无头模式,兼容性更好
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--no-sandbox')  # 必须保留,绕过沙箱限制
chrome_options.add_argument('--disable-dev-shm-usage')  # 避免/dev/shm空间不足
chrome_options.add_argument('--remote-debugging-port=9222')  # 替换pipe模式,避免权限冲突

3. 确保ChromeDriver与Chrome版本匹配

自动安装的ChromeDriver可能因www-data环境变量问题无法正常调用,建议手动配置:

  • 查看Chrome版本:
    google-chrome-stable --version
    
  • 下载对应版本的ChromeDriver,放到/usr/local/bin/并设置权限:
    sudo chmod +x /usr/local/bin/chromedriver
    sudo chown www-data:www-data /usr/local/bin/chromedriver
    
  • 修改Python代码指定Driver路径:
    driver = webdriver.Chrome(service=Service('/usr/local/bin/chromedriver'), options=chrome_options)
    

4. 验证www-data的Chrome可执行性

先直接测试www-data能否启动Chrome,排除Chrome本身的问题:

sudo -u www-data /usr/bin/google-chrome-stable --headless=new --no-sandbox --disable-dev-shm-usage --dump-dom https://google.com

如果命令能输出HTML,说明Chrome正常,问题在Selenium配置;若报错,检查Chrome是否完整安装,或给www-data添加必要的系统权限。

5. 优化PHP执行命令

使用escapeshellarg单独处理参数,避免引号转义问题,同时捕获输出便于调试:

$command = 'python3 lms_dodawanie_komputera.py edit ' . escapeshellarg($cust_id) . ' ' . escapeshellarg("haslo");
// 捕获执行输出和返回码
$output = [];
$return_var = 0;
exec($command, $output, $return_var);
// 调试时打印输出,上线后移除
var_dump($output, $return_var);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:41:09