PHPでExecを活用する7つの方法と詳細ガイド – Japanシーモア

PHPでExecを活用する7つの方法と詳細ガイド

PHPのexec関数の使用方法と実用例を解説するイラストPHP
この記事は約12分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

こんにちは、PHPに興味を持つ皆さん。

この記事を読むことで、PHPのexec関数について理解が深まり、実際にコードを書いてexecを活用できるようになります。

PHPとは、ウェブアプリケーション開発に広く使われているプログラミング言語です。

そして、その中にはexecという強力な関数が存在します。

PHPのexec関数は、PHPからシステムのコマンドを実行するための関数です。

しかし、その力強さゆえに、誤った使い方をすると予想外の問題を引き起こす可能性もあります。

そこでこの記事では、exec関数の基本的な使い方から、さまざまな応用例、そして注意点とカスタマイズ方法まで、徹底的に解説します。

●exec関数とは

PHPのexec関数は、文字列として渡されたコマンドをシステム上で実行し、その結果を文字列として返すものです。

つまり、PHPスクリプトの中からシステムレベルの操作を行うことが可能になるのです。

例えば、次のようなコードがあります。

<?php
exec('ls', $output);
print_r($output);
?>

このコードは、’ls’というコマンドを実行し、その結果を配列$outputに保存します。

つまり、ディレクトリ内のファイル一覧が取得できるのです。

●PHPでexecを使う理由

PHPでexec関数を使う理由は、PHPのスクリプトだけでは実現できない、システムレベルの操作が必要な場合があるからです。

例えば、システムの情報を取得する、外部のプログラムを実行する、シェルスクリプトを呼び出すといった場合に、exec関数を使うと便利です。

それでは、具体的なexec関数の使い方について見ていきましょう。

●execの基本的な使い方

exec関数の基本的な使い方は非常にシンプルです。

まずは最も基本的な形から見ていきましょう。基本的な形は次のようになります。

<?php
exec('コマンド', $output, $return_var);
?>

このコードではexec関数を使ってシステムコマンドを実行しています。

exec関数は3つの引数を取ります。

1つ目の引数は実行したいシステムコマンドの文字列です。

2つ目の引数はコマンドの出力結果を配列として受け取る変数です。

これはオプションで、指定しなくても問題ありません。

3つ目の引数もオプションで、コマンドの戻り値(終了ステータス)を受け取る変数です。

では、具体的な例を見ていきましょう。

○基本的な使用例:システムコマンドの実行

例えば、Linuxのlsコマンドを実行して、その出力結果と戻り値を取得するコードは次のようになります。

<?php
exec('ls', $output, $return_var);
print_r($output);
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数を使って’ls’というコマンドを実行しています。

そして、その出力結果を$output配列に、戻り値を$return_var変数にそれぞれ保存しています。

そして、その結果を表示しています。

このコードを実行すると、実行したディレクトリ内のファイル一覧が出力され、戻り値としては通常0が表示されます。

戻り値が0の場合、コマンドが正常に終了したことを意味します。

●execの応用的な使い方

exec関数を利用することで、さまざまなシステムコマンドをPHPから呼び出すことができます。

ここでは、いくつかの具体的な応用例を通じて、exec関数のさらなる活用方法を見ていきましょう。

○応用例1:ファイル操作

exec関数を使用して、ファイル操作のコマンドを実行することもできます。

例えば、Linuxのtouchコマンドを使用して新しいファイルを作成するコードは次のようになります。

<?php
exec('touch newfile.txt', $output, $return_var);
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数を使って’touch newfile.txt’というコマンドを実行しています。

touchコマンドは、指定した名前の新しいファイルを作成します。

そのため、このコードを実行すると、”newfile.txt”という名前の新しいファイルが作成されます。

そして、その結果の戻り値を表示しています。

このコードを実行した結果、戻り値が0が表示されることで、コマンドが正常に実行されたことを確認できます。

○応用例2:プロセスの情報取得

exec関数を使用すれば、システムのプロセス情報を取得することも可能です。

次のコードは、psコマンドを利用して、現在実行中のプロセスの一覧を取得する例です。

<?php
exec('ps aux', $output, $return_var);
print_r($output);
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数を用いて’ps aux’というコマンドを実行しています。

そして、その結果を$output配列に保存して、結果を表示しています。

このコードを実行すると、現在実行中のプロセスの一覧が出力されます。

○応用例3:スクリプトの実行

シェルスクリプトやPythonスクリプトなど、他のプログラムをPHPからexec関数を使って実行することも可能です。

下記のコードでは、Pythonスクリプトをexec関数で実行する例を表しています。

<?php
exec('python3 script.py', $output, $return_var);
print_r($output);
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数を利用して’python3 script.py’というコマンドを実行しています。

Pythonスクリプトを実行するためには、Pythonインタープリタ(ここではpython3)とスクリプトファイルの名前(ここではscript.py)を指定します。

そして、その結果を$output配列に保存し、結果を表示しています。

○応用例4:リモートコマンドの実行

さらに、exec関数を使ってリモートマシン上のコマンドを実行することも可能です。

その一例として、SSHを介してリモートマシン上でコマンドを実行することができます。

<?php
exec('ssh user@remotehost "ls /path/to/directory"', $output, $return_var);
print_r($output);
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数を使ってSSHを介してリモートマシンのコマンドを実行しています。

リモートマシンに接続するためには、ユーザ名(ここではuser)とリモートホスト名(ここではremotehost)を指定し、ダブルクォーテーション内に実行したいコマンドを書きます。

ここでは、lsコマンドを使ってリモートマシン上の特定のディレクトリ内のファイル一覧を取得しています。

○応用例5:コマンドライン引数の利用

また、exec関数を使ってコマンドライン引数を与えることも可能です。

この機能を活用すれば、実行するコマンドの動作をより柔軟に制御することができます。

下記のコードは、grepコマンドに引数を与えて特定のパターンを含む行を探す例です。

<?php
$pattern = 'error';
exec("grep {$pattern} /var/log/syslog", $output, $return_var);
print_r($output);
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数を使ってgrepコマンドを実行しています。

ここで指定するパターン(ここでは’error’)を用いて、特定のパターンを含む行を検索

します。そしてその結果を$output配列に保存し、結果を表示しています。

パターンが含まれる行が見つかった場合、その行が$output配列に格納されます。

○応用例6:エラー出力の取得

コマンドがエラーを出力した場合、そのエラーメッセージを取得することも必要です。

exec関数を使用してコマンドを実行した際にエラーが発生した場合、通常はそのエラー出力を取得することができません。

しかし、以下のように2>&1というリダイレクトを追加することでエラーメッセージも出力結果に含めることができます。

<?php
exec('ls /nonexistent 2>&1', $output, $return_var);
print_r($output);
echo 'Return value: ' . $return_var;
?>

このコードでは、存在しないディレクトリに対してlsコマンドを実行しているため、エラーが発生します。

そして、そのエラーメッセージを2>&1というリダイレクトを用いて標準出力にリダイレクトし、その結果を$output配列に保存しています。

これにより、エラーメッセージも$output配列に含まれ、エラーが発生した際の詳細な情報を得ることが可能になります。

○応用例7:出力結果の取得

さらに、コマンドの出力結果を取得し、その結果を活用することも可能です。

下記のコードは、exec関数でlsコマンドを実行し、その結果を$output配列に保存する例です。

<?php
exec('ls', $output, $return_var);
foreach($output as $line){
    echo $line . "\n";
}
echo 'Return value: ' . $return_var;
?>

このコードでは、exec関数でlsコマンドを実行しています。

そして、その結果を$output配列に保存し、foreach文で配列の各要素(ここでは出力されたファイル名)を一行ずつ表示しています。

これにより、lsコマンドの出力結果をプログラム内で活用することができます。

これらの応用例を参考に、PHPのexec関数を使ってさまざまなシステムコマンドを実行し、その結果を活用する方法を学んできました。

次に、exec関数の注意点と対策、カスタマイズ方法について詳しく見ていきましょう。

●execの注意点と対策

exec関数は強力な機能を提供してくれますが、使用する際にはいくつかの注意点があります。

具体的には、セキュリティ問題とパフォーマンス問題が挙げられます。

まずセキュリティについてですが、exec関数はシステムのコマンドを実行する能力を持っています。

これはシステムを操作する大きな力を意味しますが、同時にこれが悪用されると大きな問題を引き起こす可能性もあります。

特にユーザからの入力をそのままコマンドとして実行する場合、システムに悪影響を及ぼすコマンドが実行される危険性があります。

これを防ぐためには、ユーザからの入力を直接コマンドに使用しないこと、あるいは入力を適切にエスケープすることが重要です。

次にパフォーマンスについてですが、exec関数は新しいプロセスを作成してコマンドを実行します。

このプロセス作成は、一定の時間とリソースを消費します。

したがって、大量のコマンドを連続して実行する場合、パフォーマンスの低下を招く可能性があります。

この問題を軽減するためには、必要なコマンドのみを実行する、または一度の実行で多くの作業を完了するような効率的なコマンドを作成することが求められます。

以上がexec関数の使用にあたっての主な注意点とその対策です。

これらの点を理解した上で、exec関数を効果的に活用してください。

●exec関数のカスタマイズ方法

exec関数の使用をさらに便利にするために、いくつかのカスタマイズ方法を紹介します。

下記のような工夫をすることで、exec関数の能力をより広範かつ効率的に利用することができます。

まず、コマンドの実行結果をリアルタイムで取得する方法です。

デフォルトでは、exec関数はコマンドの実行が終了するまでプログラムの実行を停止します。

しかし、下記のようにパイプを利用することで、コマンドの実行結果をリアルタイムに取得し、その結果を即時に処理することが可能になります。

<?php
$handle = popen('

ls', 'r');
while(!feof($handle)){
    $buffer = fgets($handle);
    echo $buffer;
}
pclose($handle);
?>

このコードでは、lsコマンドの実行結果をリアルタイムで取得し、その結果を即時に表示しています。

これにより、長時間実行するコマンドの途中結果を確認するなど、より柔軟な操作が可能になります。

また、exec関数には戻り値の取得とエラーの取得の機能がありますが、これらを同時に行いたい場合には次のようにすることができます。

<?php
exec('ls /nonexistent 2>&1', $output, $return_var);
foreach($output as $line){
    echo $line . "\n";
}
echo 'Return value: ' . $return_var;
?>

このコードでは、存在しないディレクトリに対してlsコマンドを実行しています。

そして、その出力とエラーを$output配列に保存し、またその結果を$return_varに保存しています。

この方法を利用すれば、コマンドの実行結果とエラー情報を同時に取得できます。

これらのカスタマイズ方法を駆使することで、exec関数をさらに強力に活用することができます。

これでPHPのexec関数を活用する7つの方法と詳細ガイドについての説明を終わります。

exec関数は非常に強力なツールですが、その力を適切に制御し、安全に活用することが重要です。

本ガイドが、あなたのPHP開発に役立つ情報を提供できたことを願っています。

まとめ

PHPのexec関数は、システムコマンドを実行する能力を持つ強力なツールです。

これにより、プログラムからシステムレベルの操作を行うことが可能となり、プログラムの機能を大幅に拡張することができます。

しかし、その強力な力は適切に制御しなければなりません。

特に、ユーザの入力をそのままコマンドとして実行することは避け、パフォーマンスの観点からも効率的なコマンドの作成と実行が求められます。

また、exec関数をさらに便利に使うためのカスタマイズ方法もいくつか存在します。

コマンドの実行結果をリアルタイムで取得する方法や、コマンドの出力とエラーを同時に取得する方法など、より高度な操作が可能となります。

今回紹介した方法は一例ですが、exec関数の持つ可能性はこれらに留まりません。

あなたの要求に合わせて、exec関数を自由にカスタマイズし、あなたのプログラムをより強力に、より効率的にしてください。

本ガイドが、PHPのexec関数を利用する際の参考になれば幸いです。

引き続きPHP開発の成功をお祈りしています。