Разбор выходных данных командной строки с использованием Symfony Process

1

В моем приложении Symfony мне нужно выполнить несколько операций с файлами: список файлов из каталога, расшифровать их с помощью gpg, проанализировать вывод с помощью внешнего программного обеспечения и снова зашифровать.

Мой первый вопрос: правильно ли этот подход подходит для этой проблемы? В другом сценарии я бы написал сценарии bash/python для этого, но поскольку информация (идентификаторы пользователей, кодовые фразы и т.д.) Считываются из Symfony API, хотя было довольно удобно внедрять вызовы в приложение.

Мой второй вопрос более конкретный: есть ли способ эффективно обрабатывать выходы и ошибки командной строки? Например, когда я называю "ls", как легко преобразовать вывод в массив имен файлов?

private function decryptAction()
{
    $user_data_source = '/Users/myuser/datafiles/';

    // Scan directory and get a list of all files
    $process = new Process('ls ' . $user_data_source);

    try {
        $process->mustRun();
        $files = explode(' ', $process->getOutput());

        return $files;
    } catch (ProcessFailedException $e) {
        return $e->getMessage();
    }
}
Теги:
command-line
symfony-process

2 ответа

0

Если вам действительно не нужен немедленный ответ на вызов, такие задачи лучше оставить фоновому процессу.

Поэтому я бы написал одну или несколько команд Symfony, которые выполняют описанные процессы (чтение, дешифрование и т.д.).

Эти процессы могут выполняться через crontab или "daemonized" через другой планировщик, такой как Supervisord.

Затем вызов API создает только какой-то "семафорный" файл, который запускает фактическое выполнение, или даже лучше вы можете использовать какую-то систему очередей.

0

Нашел ответ на мой второй вопрос, но меня все еще очень интересуют ваши мысли о всем подходе.

// Scan directory and get a list of all files
        $process = new Process('ls -1 ' . $user_data_source);

        try {
            $process->mustRun();
            $files = array_filter( explode("\n", $process->getOutput()), 'strlen');
            return $files;
        } catch (ProcessFailedException $e) {
            return $e->getMessage();
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню