PHPのexec関数を使って外部コマンドを実行する方法【初心者向け】

プログラミング初心者向けにPHPのexec関数を使ってLinuxコマンドなど、外部のコマンドを実行する方法について解説しています。実行の結果は配列として変数に取得されます。ぜひ使い方を実際に書きながら理解しましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

execで外部コマンドを実行する方法について解説しています。

LinuxコマンドなどPHPにない外部のコマンドを使い慣れている人は便利な関数なので、ぜひ覚えておきましょう。

そもそもPHPが何か分からない場合は、先にPHPとはの記事をご覧ください。

 

なお本記事は、TechAcademyのPHPオンライン講座の内容をもとにしています。

 

execとは

execは外部コマンドを実行する際に使用する関数のひとつです。実行の結果は配列として変数に取得されます。

 

大石ゆかり

外部コマンドとは何でしょうか?

田島悠介

Windowsで言えば、コマンドプロンプトに命令を書くような感じかな。

大石ゆかり

OSに命令を送って、結果を取得したりすることが出来るんですか?

田島悠介

そうなんだ。少し危ない部分もあるけど。とりあえず、書き方を見てみよう!

 

execの書き方

execは以下のように記述します。

exec(実行するコマンド,実行の結果,実行のステータス)

実行するコマンド:実行する外部コマンドを入力します。
実行の結果:この箇所に変数を指定すると、コマンドを実行した結果が配列の形式で格納されます。省略が可能です。
実行のステータス:この箇所に変数を指定すると、実行したコマンドの戻り値がこの箇所に格納されます。正常に実行された場合は0となり、エラーの場合は対応した数値となります。省略が可能です。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

結果を表示する場合

コマンドを実行し、その結果を変数を用いて出力する場合の例です。

<!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で出力します。

結果は以下のようになります。

ファイルの情報が配列として画面に出力されます。

php_exec_1

 

大石ゆかり

実行してみたんですけど、何も表示されないですねー。

田島悠介

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つの文字列の次に実行結果の要素が追加されます。

php_exec_2

 

コマンドが正常に実行されたか確認する場合

成功時

先ほどと同様にコマンドの実行と結果の出力を行い、更にコマンドが正常に実行されたかを確認します。

<!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″が表示されます。

php_exec_3

 

エラー時

コマンド実行にエラーが出た場合の戻り値の例です。

<!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(エラー:コマンドを特定できない)になります。

php_exec_4

 

shell_execとの違い

shell_execexecと同じように外部コマンドを実行しますが、結果の出力形式が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_exec_5

 

大石ゆかり

フォルダの中の一覧が表示されました!

田島悠介

PHPには、サーバーのファイルやフォルダを取得する関数がたくさんあるので、今回のサンプル的な使い方は、あまり無いかな。

大石ゆかり

外部コマンドが使えれば、色んなことが出来そうですね。

田島悠介

PHPから全く違うプログラミング言語を利用して、結果を取得することも出来るし、サーバーの負荷も測定したり出来るんだ。ただ、execは危ないので注意して使いたいね。

 

おわりに

PHPのexec関数で外部のコマンドを実行する方法について解説しました。

外部コマンドを利用したい際は便利なので、ぜひ覚えておきましょう。

また、PHPを勉強していて、

  • もっと効率的に勉強したい
  • 誰かに聞きながら学びたい
  • 自分でWebサービスを作りたい

と思ったことはないでしょうか。

 

そんな方のために、TechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

独学に限界を感じている場合はご検討ください。