Разбор выходных данных командной строки с использованием 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 создает только какой-то "семафорный" файл, который запускает фактическое выполнение, или, что еще лучше, вы можете использовать какую-то систему очередей.