我写了一个工作的Artisan命令,它有两个参数:name
和import
。然后,它创建一个名为name
的MySQL数据库,并使用import
sql 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'));
这有效,但我相信有更好的方法来实现这一目标。我担心将密码硬编码到exec
命令中,并且非常确定在Laravel应用程序中使用exec
并不是最好的方法。
答案 0 :(得分:6)
虽然Laravel本身并不提供执行命令的工具,但它与 Symfony的 进程组件捆绑在一起,这使得它非常容易。它还允许异步流程执行以及实时读取流程输出。
要执行外部命令,您需要执行以下操作:
$command = "mysql -u homestead -psecret " . $this->argument('name') . "<" . $this->argument('import');
$process = new Process($command);
$process->run();
您还可以使用 ProcessBuilder 来简化流程对象的创建:
$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();
您可以在此处的流程组件文档中找到更多详细信息:http://symfony.com/doc/current/components/process.html