PHPのexec関数を使って外部コマンドを実行する方法【初心者向け】
プログラミング初心者向けにPHPのexec関数を使ってLinuxコマンドなど、外部のコマンドを実行する方法について解説しています。実行の結果は配列として変数に取得されます。ぜひ使い方を実際に書きながら理解しましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
execで外部コマンドを実行する方法について解説しています。
LinuxコマンドなどPHPにない外部のコマンドを使い慣れている人は便利な関数なので、ぜひ覚えておきましょう。
そもそもPHPが何か分からない場合は、先にPHPとはの記事をご覧ください。
なお本記事は、TechAcademyのPHPオンライン講座の内容をもとにしています。
execとは
execは外部コマンドを実行する際に使用する関数のひとつです。実行の結果は配列として変数に取得されます。
外部コマンドとは何でしょうか?
Windowsで言えば、コマンドプロンプトに命令を書くような感じかな。
OSに命令を送って、結果を取得したりすることが出来るんですか?
そうなんだ。少し危ない部分もあるけど。とりあえず、書き方を見てみよう!
execの書き方
execは以下のように記述します。
exec(実行するコマンド,実行の結果,実行のステータス)
実行するコマンド:実行する外部コマンドを入力します。
実行の結果:この箇所に変数を指定すると、コマンドを実行した結果が配列の形式で格納されます。省略が可能です。
実行のステータス:この箇所に変数を指定すると、実行したコマンドの戻り値がこの箇所に格納されます。正常に実行された場合は0となり、エラーの場合は対応した数値となります。省略が可能です。
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
実際に書いてみよう
結果を表示する場合
コマンドを実行し、その結果を変数を用いて出力する場合の例です。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <?php exec('ls', $out); print_r( $out ); ?> </body> </html>
ここではLinuxコマンドのls(ファイルやディレクトリの情報を表示する)を実行し、その結果を変数$outに格納します。最後に$outの内容をprint_rで出力します。
結果は以下のようになります。
ファイルの情報が配列として画面に出力されます。
実行してみたんですけど、何も表示されないですねー。
Windowsの場合、lsが無いので、dirに直してみよう!また、文字コードがサンプルでは、utf-8になってるけど、Windowsのシステムの文字コードは違うんだよね。文字コードを直そう!mb_convert_variables(‘UTF-8′,’SJIS-win’,$out);
今度は表示されました!
元からある配列に追加する場合
すでに配列に要素があり、それを実行結果の部分に入れた場合は配列の最後に追加されます。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <?php $out = array("aaa","bbb","ccc"); print_r ($out); echo "<br />"; exec('ls', $out, $rtn); print_r( $out ); echo "<br />"; ?> </body> </html>
ここではあらかじめ変数$outに3つの要素が存在する状態にしています。
結果は以下のように表示されます。
最初にある3つの文字列の次に実行結果の要素が追加されます。
コマンドが正常に実行されたか確認する場合
成功時
先ほどと同様にコマンドの実行と結果の出力を行い、更にコマンドが正常に実行されたかを確認します。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <?php exec('ls', $out, $rtn); print_r( $out ); echo "<br />"; echo $rtn; ?> </body> </html>
先ほどの処理に加えて変数$rtnに実行したコマンドのステータスを格納し、それを$outの次に出力します。
結果は以下のようになります。
一行目は実行結果($out)の配列が表示されます。
コマンドが問題なく実行されたため、2行目に$rtnの値”0″が表示されます。
エラー時
コマンド実行にエラーが出た場合の戻り値の例です。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <?php exec('mtime', $out, $rtn); print_r( $out ); echo "<br />"; echo $rtn; ?> </body> </html>
ここでは実行するコマンドの部分に無効なコマンドを入力しています。実行結果と実行のステータスを両方出力します。
結果は以下のようになります。
実行結果の配列は空になり、ステータスは127(エラー:コマンドを特定できない)になります。
shell_execとの違い
shell_execはexecと同じように外部コマンドを実行しますが、結果の出力形式がexecでは配列なのに対し、shell_execでは文字列として処理されます。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <?php $out = shell_exec('ls'); print_r( $out ); ?> </body> </html>
execのときと同様にlsのコマンドを実行し、それを出力します。
画面ではこのように表示されます。
ファイル一覧の情報が文字列として画面に出力されます。
フォルダの中の一覧が表示されました!
PHPには、サーバーのファイルやフォルダを取得する関数がたくさんあるので、今回のサンプル的な使い方は、あまり無いかな。
外部コマンドが使えれば、色んなことが出来そうですね。
PHPから全く違うプログラミング言語を利用して、結果を取得することも出来るし、サーバーの負荷も測定したり出来るんだ。ただ、execは危ないので注意して使いたいね。
おわりに
PHPのexec関数で外部のコマンドを実行する方法について解説しました。
外部コマンドを利用したい際は便利なので、ぜひ覚えておきましょう。
また、PHPを勉強していて、
- もっと効率的に勉強したい
- 誰かに聞きながら学びたい
- 自分でWebサービスを作りたい
と思ったことはないでしょうか。
そんな方のために、TechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。
現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、オリジナルWebサービスを開発することが可能です。
独学に限界を感じている場合はご検討ください。