今さら聞けないPHPのexec関数再入門

こんにちは、ヱビス(@evisu_phper)です。

PHPから、Linuxコマンドや他のPHPファイルを実行する時に、大活躍する「exec関数」を見直してみましょう。

「exec関数」で外部ファイルを実行する

PHPの「exec関数」は、主に外部にある別のPHPプログラムや、Linuxコマンドライン、またはNodejsなどを実行させることができる関数です。

PHPでも、実行結果を待たずに処理を進めたい時に、「exec関数」で別のプログラムを同時並行的に動作させるなどの使い方ができます。

「exec関数」の書き方

「exec関数」は、下記の構文にそって書きます。

exec( "実行したいコマンド" [,array &$アウトプット[, int &$ステータス]] );

第1引数には、「実行したいコマンド」を記述します。
文字列のみ有効なので、「”」または「’」で囲みます。

第2引数には、実行したコマンドの出力結果を、1行ごとに配列に保存されます。
大体は「$output」という変数を入れておきます。

第3引数には、コマンドのステータスが数値で返ってきます。
正常値は「0」で、正しく実行されなかった場合は整数のエラーコードが返ってきます。

コマンドは絶対参照で書く

例えば、「exec関数」でPHPを実行しようとした場合、下記のようなコードになるかと思います。

exec( "php sample.php", $output, $status );

PHPを、コマンドで実行する場合は、実行したいプログラムファイル名の前に「php」と打ち込みます。

コマンドライン上で実行する場合は問題ありませんが、「exec関数」で実行する場合は、上記の方法ではうまく動作しません。

必要なのは、PHPコマンドの絶対パスと実行したいプログラムファイルの絶対パスです。

PHPコマンドの絶対パスの確認方法

Linuxコマンドで下記のコマンドを実行することで、確認ができます。

# which php
/usr/bin/php

注意点としては、コマンドで実行するPHPと、Webブラウザ経由で実行するPHPのパスが異なる点です。

そのため、「phpinfo関数」で確認できる「Configuration File (php.ini) Path」の内容で動かそうと思っても、動かない場合があります。

「exec関数」で実行するコマンドは下記のようになります。

exec( "/usr/bin/php /var/www/html/sample.php", $output, $status );

「exec関数」によるエラーチェック

「exec関数」でエラーが発生した場合、そのまま放置することはできません。

しっかりと、エラーチェックを行い呼び出し側のプログラムを適切に停止させる必要があります。

エラーチェックで利用するのが、「exec関数」の第3引数「$status」です。

正常に終了すれば「0」が代入されていますので、下記のような内容になります。

exec( "/usr/bin/php /var/www/html/sample.php", $output, $status );

if ($status !== 0) {
	echo "Error_Code:". $status;
} 

ポイントは、比較演算子の「!==」です。
「0」が「正常」なので「==」では、「false」に反応してしまう場合があるためです。

詳細なエラー内容はログとして出力する

「$status」の番号だけでは、具体的な問題がわからない場合もあります。
その場合は、下記のようにエラーログを出力するようにすることで、詳細な状況を確認することができます。

exec( "/usr/bin/php /var/www/html/sample.php 2> error.log", $output, $status );

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です