phpvms/app/Console/Command.php

107 lines
2.6 KiB
PHP
Raw Normal View History

2017-12-30 00:23:42 +08:00
<?php
namespace App\Console;
use Log;
use Symfony\Component\Process\Process;
2017-12-30 00:23:42 +08:00
/**
* Class BaseCommand
*/
abstract class Command extends \Illuminate\Console\Command
2017-12-30 00:23:42 +08:00
{
/**
* @return mixed
*/
abstract public function handle();
/**
* Splice the logger and replace the active handlers with
* the handlers from the "cron" stack in config/logging.php
*
* Close out any of the existing handlers so we don't leave
* file descriptors leaking around
*
* @param string $channel_name Channel name to grab the handlers from
*/
public function redirectLoggingToStdout($channel_name): void
{
$logger = app(\Illuminate\Log\Logger::class);
// Close the existing loggers
try {
$handlers = $logger->getHandlers();
foreach ($handlers as $handler) {
$handler->close();
}
} catch (\Exception $e) {
$this->error('Error closing handlers: '.$e->getMessage());
}
// Open the handlers for the channel name,
// and then set them to the main logger
try {
$logger->setHandlers(
Log::channel($channel_name)->getHandlers()
);
} catch (\Exception $e) {
$this->error('Couldn\'t splice the logger: '.$e->getMessage());
}
}
2017-12-30 00:23:42 +08:00
/**
* Streaming file reader
2018-08-27 00:40:04 +08:00
*
2017-12-30 00:23:42 +08:00
* @param $filename
2018-08-27 00:40:04 +08:00
*
2017-12-30 00:23:42 +08:00
* @return \Generator
*/
public function readFile($filename): ?\Generator
2017-12-30 00:23:42 +08:00
{
$fp = fopen($filename, 'rb');
while (($line = fgets($fp)) !== false) {
$line = rtrim($line, "\r\n");
if ($line[0] === ';') {
continue;
}
yield $line;
}
fclose($fp);
}
/**
2018-08-27 00:40:04 +08:00
* @param $cmd
* @param bool $return
* @param mixed $verbose
*
* @throws \Symfony\Component\Process\Exception\RuntimeException
* @throws \Symfony\Component\Process\Exception\LogicException
2018-08-27 00:40:04 +08:00
*
* @return string
2017-12-30 00:23:42 +08:00
*/
public function runCommand($cmd, $return = false, $verbose = true): string
2017-12-30 00:23:42 +08:00
{
if (\is_array($cmd)) {
2018-08-27 00:40:04 +08:00
$cmd = implode(' ', $cmd);
}
2017-12-30 00:23:42 +08:00
if ($verbose) {
$this->info('Running "'.$cmd.'"');
}
2017-12-30 00:23:42 +08:00
$val = '';
2017-12-30 00:23:42 +08:00
$process = new Process($cmd);
$process->run(function ($type, $buffer) use ($return, &$val) {
if ($return) {
$val .= $buffer;
2017-12-30 00:23:42 +08:00
} else {
echo $buffer;
}
});
return $val;
2017-12-30 00:23:42 +08:00
}
}