是否可以在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
脚本已执行,但不在根目录中。
谢谢!
答案 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 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
标志会将新输出附加到该文件是否已存在(如果您希望有一个日志文件包含以前命令的历史记录,则非常有用)。