Разбор выходных данных командной строки с использованием 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();
}
}

1

Решение

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

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

Другие решения

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

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

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

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

0

По вопросам рекламы [email protected]