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

jea*_*_re 0 php laravel artisan laravel-5.1

我写了一个工作的Artisan命令,它有两个参数:nameimport.然后它创建一个带有名称的MySQL数据库,name并使用importsql dump 导入它.

MySQLCreate.php

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

exec("mysql -u homestead -psecret " . $this->argument('name') 
. "<" . $this->argument('import'));
Run Code Online (Sandbox Code Playgroud)

这有效但我相信有更好的方法来实现这一目标.我担心将密码硬编码到exec命令中并且非常确定exec在Laravel应用程序内部使用并不是最好的方法.

jed*_*ylo 6

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

要执行外部命令,您需要执行以下操作:

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

您还可以使用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();
Run Code Online (Sandbox Code Playgroud)

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

  • 补充一下,Process 命名空间是 *Symfony\Component\Process\Process;* (2认同)