使用Symfony Process解析命令行输出

时间:2015-08-13 09:58:27

标签: php bash symfony command-line symfony-process

在我的Symfony应用程序中,我需要对文件进行多项操作:目录中的文件列表,使用gpg解密它们,使用外部软件解析输出并再次加密。

我的第一个问题是:这是解决这个问题的正确方法吗?在另一种情况下,我已经编写了bash / python脚本来执行此操作,但是因为从Symfony API中读取了信息(用户ID,密码等),尽管将调用嵌入到应用程序中非常方便。

我的第二个问题更具体:有没有办法有效地处理命令行输出和错误?例如,当我打电话给' 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 个答案:

答案 0 :(得分: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();
        }

答案 1 :(得分:0)

除非您确实需要通过电话立即响应,否则此类任务最好留给后台进程。

所以我要做的是编写一个或多个执行所描述过程的Symfony命令(读取,解密等)。

这些进程可以通过crontab执行,或者通过另一个调度程序(如Supervisord)执行“守护进程”。

然后,API调用只会创建某种触发实际执行的“信号量”文件,甚至可以更好地使用某种队列系统。