config/consul.php
return [
'url' => 'http://127.0.0.1:8500/v1/kv/',
];
filesystems.php
'config' => [
'driver' => 'local',
'root' => base_path('config'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
命令行:
namespace App\Console\Commands\Consul;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
class DeamonCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'ue:consul:deamon
{ path : 路径 }
';
protected $items = [];
/**
* The console command description.
*
* @var string
*/
protected $description = 'consul 守护进程';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
public function handle()
{
$path = trim($this->argument('path'), '/');
$url = rtrim(config('consul.url'), '/') . '/' . $path . '/?recurse';
$client = new Client();
try {
$response = $client->request('GET', $url);
$rows = json_decode($response->getBody()->getContents(), true);
if (count($rows) == 1) {
return true;
}
$name = null;
foreach ($rows as $key => $row) {
if (substr($row['Key'], -1) == '/') {
$name = substr($row['Key'], 0, -1);
$this->items[$name] = [];
continue;
}
$key = trim(str_replace($name, ' ', $row['Key']), ' /');
$this->items[$name][$key] = base64_decode($row['Value']);
}
$this->doSave();
} catch (\Exception $ex) {
$this->error($ex->getMessage());
return true;
}
}
protected function doSave()
{
foreach ($this->items as $path => $item) {
if (!$item) {
$this->error($path .' : Is Empty.');
continue;
}
$item = array_map(function($row){
if(json_decode($row)){
return json_decode($row, true);
}
return $row;
}, $item);
$content = [
"<?php ",
"return",
var_export($item, true) . ';'
];
try {
\Storage::disk('config')->put($path . '.php', implode("\r\n", $content));
$this->line($path . ' : Write Success.');
} catch (\Exception $ex) {
$this->error($path .' : ' .$ex->getMessage());
}
}
}
}