是否可以在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 pull
或git 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
标志将把新的输出附加到文件中(如果您想要一个日志文件,其中包含以前命令的历史记录,这很有用)。