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

如何通过PHP exec函数运行Laravel Dusk测试?浏览器执行报错解决

为什么Laravel Dusk无法通过浏览器运行?怎么解决?

核心原因分析

你遇到的sh: : command not found本质是Web服务器环境找不到php命令,背后还有几个更深层的问题:

  • 环境变量与权限差异:终端里你的用户有完整的PATH环境变量,能找到PHP、ChromeDriver等工具,而且有权限访问Laravel项目的所有文件;但Web服务器(比如Apache/Nginx)是用www-data这类受限用户运行的,它的PATH可能不包含PHP的路径,也没有足够权限操作Dusk需要的资源(比如浏览器驱动)。
  • Dusk的设计定位:Laravel Dusk是命令行专属的端到端测试工具,它需要直接控制浏览器实例,而Web服务器的运行环境通常是沙箱化的,没有图形界面支持(就算用无头模式,也需要额外配置),并不适合触发这类测试。
  • 工作目录问题:当你通过浏览器访问test.php时,Web服务器的当前工作目录可能不是你的Laravel项目根目录,直接执行php artisan会找不到artisan文件。

解决方案

推荐方案:放弃浏览器触发,用命令行/CI工具运行

Dusk的设计初衷就是在开发环境的终端或者CI/CD流水线(比如GitHub Actions、GitLab CI)里运行,这是最稳定、安全的方式,完全没必要通过浏览器触发。

非推荐方案(仅用于特殊场景)

如果你确实需要通过Web触发(不推荐,存在安全风险,比如恶意用户可能滥用测试脚本),可以尝试以下调整:

  1. 使用PHP的完整路径
    先在终端执行which php找到PHP的绝对路径(比如/usr/bin/php),然后在exec命令里替换掉php:

    <?php
    // 替换成你自己的Laravel项目根路径和PHP绝对路径
    echo exec('cd /var/www/your-laravel-project && /usr/bin/php artisan dusk tests/Browser/ExampleTest.php 2>&1');
    ?>
    

    加上2>&1可以把错误输出也打印出来,方便排查问题。

  2. 给Web服务器用户足够权限
    确保Web服务器运行用户(比如www-data)能读写Laravel项目目录,并且能执行ChromeDriver:

    # 给项目目录设置权限
    sudo chown -R www-data:www-data /var/www/your-laravel-project
    sudo chmod -R 755 /var/www/your-laravel-project/storage
    # 确保ChromeDriver可执行
    sudo chmod +x /var/www/your-laravel-project/vendor/laravel/dusk/bin/chromedriver-linux
    
  3. 配置Dusk使用无头浏览器
    修改tests/DuskTestCase.php里的driver方法,强制使用无头模式,避免依赖图形界面:

    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--headless=new',
            '--disable-gpu',
            '--no-sandbox', // 这个参数对Web服务器环境很重要
        ]);
    
        return RemoteWebDriver::create(
            'http://localhost:9515',
            DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY, $options
            )
        );
    }
    
  4. 检查环境变量
    如果还是找不到命令,可以在exec命令里明确设置PATH:

    <?php
    $path = getenv('PATH') . ':/usr/bin:/usr/local/bin'; // 加上PHP和驱动所在的路径
    echo exec("PATH=$path cd /var/www/your-laravel-project && /usr/bin/php artisan dusk tests/Browser/ExampleTest.php 2>&1");
    ?>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:18:11