*/ class Monitor extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'monitor {config} {--interval=5 : how often to attempt relayout in seconds}'; /** * The console command description. * * @var string */ protected $description = 'Relayout on a schedule'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @param \App\ILayoutDriver $driver * @return void */ public function handle(\App\ILayoutDriver $driver) { $config_file = $this->argument('config'); if (!file_exists($config_file) || !is_readable($config_file)) { throw new \Exception("Cannot read config file: $config_file"); } $config = new \App\Configuration(); $config->load($config_file); $engine = app()->make(\App\Engine::class, ['config' => $config]); declare(ticks=1); $signal_handler = static function(int $signal) use ($config_file, &$engine) { switch ($signal) { case SIGHUP: $config = new \App\Configuration(); $config->load($config_file); $engine = app()->make(\App\Engine::class, ['config' => $config]); break; } }; pcntl_signal(SIGHUP, $signal_handler); while (true) { $engine->layout(); sleep((int)$this->option('interval')); } } }