В моем приложении 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();
}
}
Если вам действительно не нужен немедленный ответ на вызов, такие задачи лучше оставить фоновому процессу.
Поэтому я бы написал одну или несколько команд Symfony, которые выполняют описанные процессы (чтение, дешифрование и т.д.).
Эти процессы могут выполняться через crontab или "daemonized" через другой планировщик, такой как Supervisord.
Затем вызов API создает только какой-то "семафорный" файл, который запускает фактическое выполнение, или даже лучше вы можете использовать какую-то систему очередей.
Нашел ответ на мой второй вопрос, но меня все еще очень интересуют ваши мысли о всем подходе.
// 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();
}