【问题标题】:Parse command line output using Symfony Process使用 Symfony 进程解析命令行输出
【发布时间】:2015-11-06 05:36:49
【问题描述】:

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

我的第一个问题是:这是解决这个问题的正确方法吗?在另一种情况下,我会编写 bash/python 脚本来执行此操作,但由于信息(用户 ID、密码短语等)是从 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();
    }
}

【问题讨论】:

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


    【解决方案1】:

    除非您确实需要立即响应呼叫,否则最好将此类任务留给后台进程。

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

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

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

    【讨论】:

      【解决方案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();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多