首页 > 解决方案 > Laravel - 在控制器中执行命令,跟踪进度

问题描述

我有一个系统,用户可以通过单击按钮下载作曲家包。安装顺利,包也安装好了,但无法跟踪命令的进度。我想跟踪进度并将其显示在进度条中,但我不太知道如何做?

链接

<a href="{{ route('install_package') }}" class="badge badge-light fa-1x">Install</a>
<div class="progress">
    <div class="progress-bar" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
</div>

<a href="{{ route('uninstall_package') }}" class="badge badge-light fa-1x">Uninstall</a>

路线

Route::get('package/install', 'PackageController@install')->name('install_package');
Route::get('package/uninstall', 'PackageController@uninstall')->name('uninstall_package');

控制器

public function install()
    {
        $package = new Process("composer require rainieren/visitors");
        $package->setWorkingDirectory(base_path());
        $package->run();

        return redirect('/');
    }

    public function uninstall()
    {
        $package = new Process("composer remove rainieren/visitors");
        $package->setWorkingDirectory(base_path());
        $package->run();

        return redirect('/');
    }

这可以做到吗?提前致谢!

标签: javascriptphplaravellaravel-5

解决方案


您可以使用execshell_execphp 函数。例如

exec('composer require rainieren/visitors');
// or
shell_exec('composer require rainieren/visitors');

看:

http://php.net/manual/en/function.shell-exec.php

http://php.net/manual/en/function.exec.php

或者你可以这样做:

$phpFinder = new PhpExecutableFinder();

        if($phpBin = $phpFinder->find()) {

            $cmdLine = "$phpBin ".base_path('lib/composer/composer.phar').' require rainieren/visitors';
            $process = new Process(str_replace('\\','/',$cmdLine),base_path($this->getDistPath()));
            $process->setTimeout(0);
            $process->mustRun(function($type,$line){
                // get output if needed
            });
        }

不要依赖全局作曲家安装,该路径可在项目基础文件夹中访问。

Ps PhpExecutableFinder


推荐阅读