Laravel在控制器中运行composer/git命令


Laravel run composer / git commands within controller

是否可以在Laravel中的控制器中运行composer或git命令?类似的东西:

class TestController extends Controller
{
    //
    public function shell(Request $request){
        if($request->isMethod('post')){

            $data['output'] = shell_exec('composer update');
            // or some git commands
            return view('tests.shell', $data);
        } else {
            return view('tests.shell');
        }
    }
}

如果我按照上面显示的方式进行操作,我将不会收到任何消息。我认为,问题是,这些命令必须在项目根目录中运行,而不是在子文件夹中。

有没有php函数可以运行一个完整的shell脚本,而不仅仅是单个命令?

我测试过这个:

echo shell_exec('php ' . __DIR__ . '/../shell.php');
// shell.php is in projects root directory

脚本会执行,但不会在根目录中执行。

谢谢!

我以前没有注意到它,但Laravel附带了一个运行终端命令/composer命令的工具。您可以使用Symfony的流程组件。因此,运行命令变得非常容易。

Laravel 5.2的一个例子:

namespace App'Http'Controllers;
use Illuminate'Database'Eloquent'ModelNotFoundException;
use Illuminate'Http'Request;
use App'Http'Requests;
use Symfony'Component'Process'Process;
use Symfony'Component'Process'Exception'ProcessFailedException;
class SetupController extends Controller
{
    public function setup(){
        $migration = new Process("php artisan migrate");
        $migration->setWorkingDirectory(base_path());
        $migration->run();
        if($migration->isSuccessful()){
            //...
        } else {
            throw new ProcessFailedException($migration);
        }
    }
}

您可以尝试以下操作:

$data['output'] = shell_exec( '(cd '. base_path() .' && /usr/local/bin/composer info)' );
// debug
dd( $data );

命令位于()中,因此如果项目和执行composer info,我们将模式设置为根文件夹。

下面的git命令也可以工作,但不适用于git pullgit fetch:

$data['output'] = shell_exec( '(cd '. base_path() .' && /usr/bin/git status)' )

我也尝试过/usr/local/bin/composer update命令,但由于必须等待包更新,脚本要么返回null,要么超时。

同样值得指出的是,应该使用composer/git的完整路径,即/usr/local/bin/composer,否则您将始终看到返回的null

对于您的PHP脚本,请尝试类似的方法:

echo shell_exec('(cd '. base_path() .' && php shell.php)');

编辑

如果您想将命令的输出记录到文件中并尝试在PHP中捕获,可以尝试:

$data['output'] = shell_exec( '(cd '. base_path() .' && /usr/bin/git status | tee -a file.log)' )

tee -a file.log部分将把输出保存到file.log,也将输出保存到屏幕(因此shell_exec可以拾取输出),如果文件已经存在,-a标志将把新的输出附加到文件中(如果您想要一个日志文件,其中包含以前命令的历史记录,这很有用)。