javascript - 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('/');
}
这可以做到吗?提前致谢!
解决方案
您可以使用exec
或shell_exec
php 函数。例如
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
});
}
不要依赖全局作曲家安装,该路径可在项目基础文件夹中访问。