Лучшая практика PHP-CLI для регистрации прогресса / вывода и отлова ошибок - PullRequest
0 голосов
/ 27 августа 2018

Я пишу инструмент PHP CLI. Инструмент имеет ряд параметров командной строки. Это будет класс. Я буду загружать экземпляр и запускать команду со всеми переданными аргументами.

Каковы наилучшие способы захвата информационных сообщений по мере их продвижения, а также перехвата ошибок и остановки при ошибках с выводом на экран?

Какой идеальный пример PHP CLI?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Я предпочитаю использовать своего рода шаблон наблюдателя для обработки и оставить обработку ошибок для консольного приложения:

class ExampleService
{
    /**
     * @var array
     */
    private $params;

    public function __construct(array $params)
    {
        $this->params = $params;
    }

    /**
     * @param callable|null $listener
     */
    public function execute(callable $listener = null)
    {
        foreach (['long', 'term', 'loop'] as $item) {
            // do complex stuff
            $listener && $listener($item);
        }
    }
}

require_once __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

$app = new Application;
$app->add($command = new Command('example'));

$command->addOption('opt1');
$command->addArgument('arg1');
$command->setCode(function(InputInterface $input, OutputInterface $output) {
    $service = new ExampleService($input->getOptions() + $input->getArguments());
    $service->execute(function($messages) use($output){
        $output->writeln($messages);
    });
});

$app->run();
0 голосов
/ 27 августа 2018

Я использую в качестве шаблона что-то вроде этого (для достаточно простых консольных скриптов):

$inputFile = null;
$outputFile = null;
try {
    // Checking command-line arguments
    if (1 === $argc) {
        throw new Exception('Missing input file path.');
    }

    $inputFilePath = $argv[1];
    if (!file_exists($inputFilePath) || !is_readable($inputFilePath)) {
        throw new Exception('Input file does not exist or cannot be read.');
    }

    $inputFile = fopen($inputFilePath, 'r');

    if (2 < $argc) {
        $outputFilePath = $argv[2];
        if (!is_writable($outputFilePath)) {
            throw new Exception('Cannot write to output file.');
        }

        $outputFile = fopen($outputFilePath, 'w');
    } else {
        $outputFile = STDOUT;
    }

    // Do main process (reading data, processing, writing output data)
} catch (Exception $e) {
    // Show usage info, output error message

    fputs(STDERR, sprintf('USAGE: php %s inputFilePath [outputFilePath]', $argv[0]) . PHP_EOL);
    fputs(STDERR, 'ERROR: ' . $e->getMessage() . PHP_EOL);
}

// Free resources

if ($inputFile) {
    fclose($inputFile);
}

if ($outputFile) {
    fclose($outputFile);
}
...