如何避免在 Laravel Artisan 命令中使用 exec

How to avoid using exec inside of Laravel Artisan command

我写了一个带两个参数的 Artisan 命令:nameimport。然后它创建一个名为 name 的 MySQL 数据库,并使用 import sql 转储导入其中。

MySQLCreate.php

exec("mysql -u homestead -psecret -e \"create database " 
. $this->argument('name') . "\"");

exec("mysql -u homestead -psecret " . $this->argument('name') 
. "<" . $this->argument('import'));

这行得通,但我相信有更好的方法来实现这一点。我担心将密码硬编码到 exec 命令中,并且我很确定在 Laravel 应用程序中使用 exec 不是执行此操作的最佳方法。

虽然 Laravel 本身不提供执行命令的工具,但它与 Symfony 的 Process 组件捆绑在一起这使它变得非常容易。它还允许异步流程执行以及实时读取流程输出。

为了执行外部命令,你需要做:

$command = "mysql -u homestead -psecret " . $this->argument('name') . "<" . $this->argument('import');
$process = new Process($command);
$process->run();

您还可以利用 ProcessBuilder 来简化 Process 对象的创建:

$builder = new ProcessBuilder();
$builder->setPrefix('mysql');
$builder->->setArguments([
  '-u homestead', 
  '-psecret',
  $this->argument('name')
]);
$builder->setInput(file_get_contents($this->argument('import')));
$builder->getProcess()->run();

您可以在此处的 Process 组件文档中找到更多详细信息:http://symfony.com/doc/current/components/process.html