【问题标题】:Is it possible to capture the output of a CLI command (exec) to a PHP script variable?是否可以将 CLI 命令 (exec) 的输出捕获到 PHP 脚本变量?
【发布时间】:2020-08-20 19:55:26
【问题描述】:

我有一个带有一堆可执行文件 (DCMTK) 的外部库。通常,这些可以在 CLI 上执行,有时会在终端中显示输出。我想在 PHP 脚本中使用其中的一些,我可以用一个来做到这一点。

要点是:

// path to the executables.

private static $dcmtk_path = '/usr/local/opt/dcmtk/bin/';

//method to execute the dcmtk executable.

public static function dcmtk_command($command) {
    //--logfile dcmlogfile.cfg
    echo exec(self::$dcmtk_path . $command); // $outputarray, 2nd arg ?
    }
}

// working example that converts a text file to a dcm worklist file

file_put_contents (self::$MWL_PATH . "samplephp.txt", $template); // text file for MWL.
echo '[{"status":"Sent to PATH"}]';
self::dcmtk_command('dump2dcm ' . self::$MWL_PATH . "samplephp.txt " . self::$MWL_PATH . "samplephp.wl");

我不知道这是否可能。但是,我通过 $_POST 上传多个文件并得到:

 $file_tmp = $files['tmp_name'];

这是保存到服务器上的一个路径:

 $success = move_uploaded_file($file_tmp, $upload_path);

然后我想执行另一个命令:

self::dcmtk_command('dcmdump ' . $upload_path . $file_name );
// dcmdump +P StudyInstanceUID IM-0001-0004.dcm for specific tag

当从 CLI 执行时,将一堆文本打印到终端 (?STDOUT)。我想要做的是在 PHP 脚本中捕获该输出,以便我可以处理输出。我尝试了一些东西,比如使用输出缓冲区、exec 命令中的 $outputarray 等。

似乎应该可以。这些文件将保存在服务器上配置的路径中,因此它们应该位于 $upload_path 。 $文件名。而且,我在 PHP 控制台/错误日志中看不到任何错误。我实际上没有很好的方法来检查命令是否成功。

【问题讨论】:

标签: php stdout dcmtk


【解决方案1】:

再次感谢。这样就行了。

$proc = proc_open($dcmtk_path . 'dcmdump +P StudyInstanceUID ' . $upload_path,[
1 => ['pipe','w'],
2 => ['pipe','w'],
],$pipes);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($proc);
DatabaseFactory::logVariable( $stdout);  

如果我愿意,甚至可以只获得一个标签。它在一个变量中捕获该单行,例如:

(0020,000d) UI [1.3.76.2.1.1.4.1.2.5310.511614778]      #  34, 1 StudyInstanceUID

需要某种函数来提取括号之间的内容:

这几乎可以工作:

$text = '(0020,000d) UI [1.3.76.2.1.1.4.1.2.5310.511614778]      #  34, 1 StudyInstanceUID';
preg_match_all("/\[([^\]]*)\]/", $text, $match);
print_r($match);

Array
(
    [0] => Array
        (
            [0] => [1.3.76.2.1.1.4.1.2.5310.511614778]
        )

    [1] => Array
        (
            [0] => 1.3.76.2.1.1.4.1.2.5310.511614778
        )

)

【讨论】:

    【解决方案2】:

    作为后续,我想要一种在进程抛出错误时捕获错误的方法。我强制了一个,它在输出流(不是错误流)中打印:

    作为后续,是否有可能捕获 proc_open 中的命令引发的错误。在某些情况下可能会抛出错误:

    例如我在 CLI 上得到了看起来像警告和错误的东西(故意让它这样做)。我想要一种方法来捕捉那些?

    [2020 年 5 月 7 日 12:29:46 美国/开曼]

    W: DcmItem: Length of element (5089,474e) is odd
    E: DcmElement: Unknown Tag & Data (5089,474e) larger (169478669) than remaining bytes in file
    E: dcmdump: I/O suspension or premature end of stream: reading file: /Users/sscotti/Desktop/newtelerad2/dicomtemp/tattoo.dcm
    

    看起来可能:

    proc_get_status ( resource $process ) : array can give that with the exit code:
    
    {
        "command": ". . . .",
        "pid": 8245,
        "running": false,
        "signaled": false,
        "stopped": false,
        **"exitcode": 1,**
        "termsig": 0,
        "stopsig": 0
    }
    

    谢谢。

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      相关资源
      最近更新 更多