如何避免在 Laravel Artisan 命令中使用 exec
How to avoid using exec inside of Laravel Artisan command
我写了一个带两个参数的 Artisan 命令:name
和 import
。然后它创建一个名为 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
我写了一个带两个参数的 Artisan 命令:name
和 import
。然后它创建一个名为 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