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

时间:2016-03-31 08:01:14

标签: php shell cmd laravel-5 composer-php

是否可以在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');
        }
    }
}

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

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

我测试了这个:

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

我之前没有注意到它,但是Laravel附带了一个运行终端命令/编辑器命令的工具。您可以使用Symfony中的The Process Component。因此,运行命令变得非常容易。

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);
        }
    }
}

答案 1 :(得分:0)

您可以尝试这样的事情:

$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标志会将新输出附加到该文件是否已存在(如果您希望有一个日志文件包含以前命令的历史记录,则非常有用)。