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

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

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

Мой второй вопрос более конкретен: есть ли способ эффективно обрабатывать результаты командной строки и ошибки? Например, когда я вызываю '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();
    }
}

2 ответа

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

// 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();
        }

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

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

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

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

Другие вопросы по тегам