【PHP入門】外部コマンドの実行(exec)とコマンドライン実行の方法

書いた人 ヤマシタ
侍エンジニア塾ブログは、未経験からWebアプリ開発と仕事獲得をサポートする
侍エンジニア塾のオウンドメディアです。
プログラミング学習を覗き見

こんにちは!フリーエンジニアのヤマシタです。

PHPではプログラムの中からLinuxやコマンドプロンプトで使用するコマンドを実行したり、シェルスクリプトなどの外部プログラムを実行するための関数が用意されています。

この記事では、

・exec関数とは?
・exec関数で外部コマンドを実行する方法

という基本的な内容から、

・外部コマンドによる出力結果を全て取得する方法
・外部コマンドによる実行結果のステータスを取得する方法
・pingによるネットワーク機器の疎通確認をする方法
・sshによるリモートコマンドを実行する方法
・shell_exec関数を使用した外部コマンドの実行方法

などのexec関数の応用的な使い方についても解説します。

さらに、

・PHPをコマンドラインから実行する方法
・PHPをコマンドラインから実行する時に便利なオプション

についても解説していきます!

exec関数とは

PHPのプログラムから、外部コマンドやプログラムを実行するにはexec関数を使用します。

外部コマンドとは、Windowsのコマンドプロンプトで実行するコマンドや、MacやLinuxのターミナルからのコマンドによる命令文のことを指します

exec関数では、そんな外部コマンドを指定して実行することが可能です。

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

書き方:

引数:
第一引数には実行するコマンドやプログラム名を指定します。

第二引数を指定した場合は、コマンドの出力結果を各行ごとに配列に格納されます。

第三引数を指定した場合は実行したコマンドのステータスを取得できます。

返り値:
コマンドの出力の最後の行を文字列で返します。

exec関数の使い方

ここでは実際にexec関数を使用して、外部コマンドを実行してみましょう。

以下の例では指定したディレクトリに存在するファイルやディレクトリを一覧で取得するコマンド「ls -l」を実行してみます。

Windowsの場合は同様のコマンドである「dir」を指定すると良いでしょう。

サンプルプログラム:

実行結果:

外部コマンドの結果を取得することができましたが、一行でしか表示されていませんね……。

これはexec関数は第二引数のアウトプットを指定しないと、実行結果の最後の行しか返さないからです。

出力結果をすべて取得する

exec関数で外部コマンドの全ての出力結果を取得するには、前述したように第二引数にアウトプット用の配列を指定する必要があります。

以下に第二引数を指定して、出力結果を全て取得する方法を記述します。

サンプルプログラム:

実行結果:

このように第二引数を指定すれば、出力結果がすべて1行ごとに配列に格納されていますね!

ステータスを取得する

exec関数によるコマンドが正常に終了したかを確認する場合は、第三引数のステータスを指定します。

ステータスはLinuxのコマンド同様に0(正常終了)0以外(失敗)となります。

以下に第三引数を指定して、実行結果のステータスを取得する方法を記述します。

サンプルプログラム(正常終了):

実行結果(正常終了):

サンプルでは、コマンドが正常に終了したため、0が出力されました。

以下は、存在しないディレクトリに対して「ls -l」コマンドを実行した結果です。

サンプルプログラム(失敗):

実行結果(失敗):

存在しないディレクトリを指定したので、実行結果は1(失敗)となりました。

このようにexecコマンドは第三引数を指定すれば、コマンドの成功有無をステータスで判断できることがわかりますね!

また、はじめに紹介したようにexecコマンドは、コマンド以外にも外部プログラムも同様に指定することが可能です。

配列に値を追加する

exec関数は、既に値が設定されている配列を第二引数に指定した場合、execコマンドによる実行結果がその配列の要素の最後から追加されます。

サンプルプログラム:

実行結果:

このように配列の要素の最後に、lsコマンドの結果が追加されていることがわかります。

exec関数が失敗する原因

前述したように、exec関数の第三引数を使用して、コマンドが正常に終了したかどうかのステータスを取得することができます。

ここでは0以外の失敗のステータスが返される例をあげ、どのように対応したらよいかを解説していきます。

コマンドが見つからない

存在しないコマンドをexec関数で実行すると、失敗のステータスが返されます。

以下は間違ったコマンドを実行した例です。

サンプルプログラム:

実行結果:

「l」というコマンドは存在しないため、127という失敗のステータスが返ってきています。

この場合は、コマンドに入力ミスがないかコマンドにパスが通っているか、を確認する必要があります。

コマンドに実行権限がない

実行権限がないコマンドをexec関数で実行した場合も、失敗のステータスが返されます。

以下は、rootユーザ以外のユーザで「/root」の一覧を取得しようとした例です。

サンプルプログラム:

実行結果:

このような場合は、コマンドをsudoで実行することで解決することができます。

sudoroot権限でコマンドを実行することのできるコマンドです。

sudoでコマンドを実行するには実行ユーザのパスワード入力が必要になります。

通常は端末からパスワードを入力するよう促されますが、sudoコマンドの「-S」オプションを使用することで、パスワードを端末入力ではなく標準入力から読み込むことができます。

sudoでコマンド実行するサンプルです。

サンプルプログラム:

実行結果:

‘pass’には実行するユーザのパスワードを記述してください。

$cmdの中の「|」はパイプといい、複数のコマンドを組み合わせる役割を持ちます。

ここでは、「echo ‘pass’」の出力を「sudo -S ls /root」に渡すことができます。

これで、途中でパスワード入力を行うことなく実行できます。

pingによる導通確認

pingとは、主にネットワークの疎通を確認するために使用されるコマンドです。

特に大規模なシステムでは、たくさんのネットワークマシンを使用するため、

「事前にネットワークが正常に疎通するか?」

確認するためによく使用されます。

pingはネットワークに繋がっていて、IPアドレスを保持している機器であれば、疎通確認ができます。

exec関数は外部コマンドが使用できるため、以下のようにpingによる疎通確認ができます。

サンプルプログラム:

実行結果:

このようにpingコマンドを実行すれば、通信先の機器がネットワークに接続されているか、第三引数のステータスを取得することにより疎通確認をすることができます。

$ipaddrの’xxx.xxx.xx.x’;の箇所は、ご自身のPCやネットワークサーバのIPアドレスに置き換えて確認してみてください。

ssh(セキュアシェル)を実行する

sshとはSecure Shell(セキュアシェル)の略称で、ネットワーク上のリモートコンピュータと通信して命令を実行したり、データをやりとりするときに使用します。

sshは認証やネットワーク上のやりとりが全て暗号化されるため、安全に通信をすることができます。

PHPでsshによるコマンドを実行する場合は、ssh2_exec関数を使用します。

ssh2_exec関数でsshの通信を行うは、事前に公開鍵と秘密鍵の設定をしておく必要があります。

ssh設定の詳細については、以下のページを参照してください。
https://www.adminweb.jp/web-service/ssh/index8.html
http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/sshd_config.html

以下はsshによるリモートコマンドを実行する一般的な方法となります。

サンプルプログラム:

ssh2_connectではリモートコンピュータのIPアドレスと、ポート番号の22番を指定します。

ポート番号22は、sshでログインするときに使用する番号となります。

ssh2_auth_passwordではリモートコンピュータのユーザ名とパスワードを指定します。

ログインが成功したらssh2_exec関数により、外部コマンドを実行します。

shell_exec関数とは

shell_exec関数はexec関数と同じく外部コマンドを実行し、出力結果を返します。

shell_exec関数は以下のように記述します。

書き方:

引数:
実行するコマンドやプログラム名を指定します。

execコマンドと異なる点は、

・第二引数に結果を格納するための配列が指定できない。
・第三引数にステータスを指定できないため、実行に失敗したかどうかを判断することができない。

などが挙げられます。そのため、

単純に外部コマンドを実行するだけならshell_exec関数。
出力結果を配列で格納したり、実行時のステータスが知りたい場合はexec関数。

と、使い分けると良いでしょう。

返り値:
実行されたコマンドの出力を返します。

実行時にエラーが発生、または何も出力しなかった場合はNULLを返します。

以下はshell_exec関数の簡単なサンプルです。

サンプルプログラム:

実行結果:

コマンドラインでPHPを実行する

PHPはWebアプリケーション開発によく使われるので、ブラウザから実行する場合が多いのですが、コマンドラインから実行することもできます

コマンドラインとは、Windowsのコマンドプロンプト、MacやLinuxのターミナルのようにキーボードからコマンドを打ち込むツールです。

ここでは、PHPをコマンドラインで実行する方法と便利なオプションについて解説していきます。

PHPファイルを実行する(-fオプション)

PHPファイルをコマンドラインから実行するには以下のように指定します。

コマンドラインからの実行方法:

-f」オプションはなくても動作します。

対話的に実行する(-aオプション)

-a」オプションを使用すると、PHPファイルを作成することなく、対話的に実行することができます。

ちょっと関数の動作を確認したい、といった場合に便利です。

実行サンプル:

php -a」を入力してから、「quit」または「exit」が入力されるまで実行されます。

1行のコードを実行する(-rオプション)

-r」オプションを使用すると、1行のコードを簡単に実行することができます。

実行サンプル:

「-a」オプションより簡単な処理を試すのに適しています。

コマンドラインでPHPを実行する時のオプションには様々なものがあります。以下のページを参照してください。
http://php.net/manual/ja/features.commandline.options.php

コマンドラインでの実行については、以下の記事でも解説しています!

まとめ

今回はPHPで外部コマンドを実行する、PHPをコマンドラインから実行するということについて解説しました。

外部コマンドを実行するexec関数は、

・コマンドプロンプトやターミナルから実行するコマンドをそのまま使用できる。
・Linuxやコマンドプロンプトなどの外部コマンドや外部プログラムを実行することができる。
・pingによる導通確認ができる。
・ssh2_execではsshによるリモートコマンドが実行できる。
・よく似た関数としてshell_exec関数がある

コマンドライン実行時のオプションには、

・「-f」オプションで実行するPHPファイルを指定できる
・「-a」オプションでPHPのコードを対話的に実行できる
・「-r」オプションでPHPの1行コードを実行できる

などがわかりましたね!

もしexec関数の使い方やコマンドライン実行について忘れてしまったら、この記事を思い出してくださいね!


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーランスをされている市川友哉さん。33歳で、プログラミングを学び始め、4ヶ月という短い期間でフリーランスエンジニアとして独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


現役フリーランスエンジニアによる無料体験レッスン実施中!

もし、あなたが、

  • 経験、年齢、学歴に不安がある
  • 挫折しない学習方法が知りたい
  • アプリ開発で困っている
  • エンジニアの”生”の声が聞きたい!
  • 仕事獲得の仕方がわからない
  • エンジニアに転職したいが何をすればいいかわからない

など、プログラミング学習やキャリアのことでお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_mtm3

非常識な結果を出した卒業生

活躍する現役エンジニア

人気記事セレクション

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

ヤマシタ

フリーランスエンジニア。ITに関わるさまざまなコンテンツの企画・制作も行っています。
ITに関してはノウハウ系、ライフハック系、トレンド系など、今まで200本以上の執筆経験があります