それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

php のコマンド実行のproc_open でexitcode を取得する

proc_open でexitcode を取得すると -1 になる

proc_open の関数で、exitcode を参照すると、常に -1 が固定で返ってくる件

proc_get_status($process)['exitcode']; // -1
proc_get_status($process)['exitcode']; // -1
array:8 [
  "command" => "ssh"
  "pid" => 6694
  "running" => false
  "signaled" => false
  "stopped" => false
  "exitcode" => -1
  "termsig" => 0
  "stopsig" => 0
]

原因

プロセス終了後に status 取得すると、常に -1 しか返ってこない。そういうものである

対策。

proc_get_status($process)['running']false になった瞬間の status を保存しておくと exitcode が正しく取れる。

終了後に初めて呼び出したときに、正しいexitcode が取れる。それ以降は「終了済み」を示す -1 が常に返ってくる。

<?php 
$cmd = ['ssh','localhost', '/bin/noexists_command'];
$process = proc_open($cmd, [2=>$fd_ferr=fopen('php://temp','w')] , $pipes);
if( ! is_resource($process) ) { throw new \Exception("実行エラー");}

do {
        $stat = proc_get_status($process);
        // waiting
        usleep(1000*1);
} while($stat['running']);

if ($stat['exitcode'] > 0 ){
        fseek($fd_ferr,0);
        $err = stream_get_contents($fd_ferr);
        throw new \Exception($err);
}

これは、気づかんわ。

参考資料

https://stackoverflow.com/questions/7645499/getting-the-real-exit-code-after-proc-open