Можно ли записать вывод команды CLI (exe c) в переменную сценария PHP? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть внешняя библиотека с кучей исполняемых файлов (DCMTK). Обычно они могут выполняться в интерфейсе командной строки, а вывод иногда отображается в терминале. Я хочу использовать некоторые из них в сценариях 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

При выполнении из интерфейса командной строки, который выводит на терминал набор текста (? STDOUT). Что я хочу сделать, так это записать этот вывод в сценарий PHP, чтобы я мог его обработать. Я пробовал несколько вещей, например, использование выходного буфера, массива $ outputarray из команды exe c, et c.

Похоже, это должно быть возможно. Файлы сохраняются на сервере по указанному пути, поэтому они должны находиться по адресу $ upload_path. $ имя_файла. И я не вижу ошибок в консоли / журнале ошибок PHP. На самом деле у меня нет хорошего способа проверить, была ли команда успешной.

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

В качестве продолжения я хочу найти способ отловить ошибку, если процесс выдает ошибку. Я форсировал один, и он печатает это в потоке вывода (а не в потоке ошибок):

Как продолжение, возможно ли поймать ошибку, вызванную командой в proc_open. Бывают случаи, когда это может вызвать ошибку:

например, я получаю то, что выглядит как предупреждение и ошибки в интерфейсе командной строки (намеренно заставил его это сделать). Я хотел бы найти способ их поймать?

Спасибо.

0 голосов
/ 06 мая 2020

Еще раз спасибо. Вот и все.

$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
        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...