SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】exec()関数の挙動がphp4とphp5で少し違った

問題

制御文字当を含む結果を出力するコマンドを、exec()で実行したとき、取得できる結果がおかしい。

下のような処理をするとき、$outputに格納される結果が、php4系のときとphp5系のときで違った。

exec("xxxxあるコマンドxxxx", $output, $return_var);

解決策

コマンドの結果にバイナリデータが含まれる場合は、passthru()関数を使った方がよい。

ob_start();
passthru("xxxxあるコマンドxxxx", $return_var);
$output = ob_get_clean();

マニュアルに以下のように書いてあるので、確かにexec()で実行して、バイナリを含む結果を取得するのはよした方がよいのでしょう。

返り値

コマンド結果の最後の行を返します。コマンドを実行し、 一切干渉を受けずに直接コマンドから全てのデータを受けとる必要が あるならば、PassThru() 関数を使ってください。

末尾のホワイトスペースも除去されるらしい。

exec()を使ってしまって、しかもほとんどうまく動くようだったのでそのままにしていたら、問題が発生したことがありました。

まとめ

確実にテキストが返ってくるコマンドの場合や、実行するだけでよい場合はexec()1行でOK。

バイナリが返ってくる時、空白や改行など含めて一字一句間違いなく結果を取得したいときはちょっと面倒だけどpassthru()で。

関連するメモ

コメント