如何避免在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 component docs中找到更多详细信息:http://symfony.com/doc/current/components/process.html