【PHP】PHPから「Ruby」や「シェル」などを実行する方法(PHPから外部のプログラムを呼び出す方法)

PHP のプログラムの中から「Ruby」「シェル」を呼び出す方法について解説します。

私は「Python」や「Ruby」や「シェル」を Web アプリから実行するプログラムを作成することがあるので PHP で Web アプリを作成して Python や Ruby と連携しています。

「exec関数」「system関数」「shell_exec関数」がありますが、私は使い勝手のいい「exec関数」をよく使っています。

 

 

exec 関数

exce 関数の長所は、「コマンド」「プログラム」「シェル」を呼び出して実行結果のステータスを返すことができます。

<?php

// Rubyプログラムを呼び出すシェルスクリプトを呼出し
$cmd = ‘/var/www/html/cre.sh’; ← cre.sh 内で Ruby のプログラムを呼び出しています。
exec($cmd, $output, $return_status); ← 引数を指定します。
echo “プログラム実行結果のステータス : “;
echo “$return_status<br>”; ← プログラムの実行結果のステータスを表示します。

?>

 

実行結果のステータスを取得したい場合は、exec 関数に引数を3つ付ける必要があります。

exec 関数の引数は以下のように規定されます。

  • 引数が1つだけの場合 ← 1番目の引数がコマンド
  • 引数が2つの場合 ← 1番目の引数がコマンド、2番目の引数がコマンドの実行結果
  • 引数が3つの場合 ← 1番目の引数がコマンド、2番目の引数がコマンドの実行結果、3番目の引数がコマンドの実行結果のステータス

 

そのため、コマンドやプログラムの実行結果のステータスが欲しい場合は、引数が3つ必要です。

仮に2番目の「コマンドの実行結果」を必要としなくても引数は入れておく必要があります。

 

※exec 関数の返り値はコマンド実行結果の最後の行になります。

たとえば exec 関数の返り値が欲しい場合は以下のようになります。

<?php

// Rubyプログラムを呼び出すシェルスクリプトを呼出し
$cmd = ‘/var/www/html/cre.sh’; ← cre.sh 内で Ruby のプログラムを呼び出しています。
$rtn = exec($cmd); ← 引数を指定します。
echo “プログラム実行結果の最後の行 : “;
echo “$rtn<br>”; ← プログラムの実行結果の最後の行を表示します。

?>

 

 

 

 

プログラム正常終了は「0」、プログラム異常終了は「1」

exec 関数による「コマンド」や「プログラム」や「シェル」の実行結果のステータスは以下のようになります。

  • プログラム正常終了:0
  • プログラム異常終了:1

 

 

system 関数

「system 関数」「exec 関数」と似ています。

両者の違いは

  • exec 関数 ← 引数3つで「コマンドの実行結果」と「コマンドの実行結果のステータス」を取得できる
  • system 関数 ← 引数2つのみで「コマンドの実行結果のステータス」のみ取得できる

です。

 

 

shell_exec 関数

shell_exec 関数は単純です。

exec関数やsystem関数と異なり、引数はありません。

ただし返り値が「コマンドの実行結果」です。

// Rubyプログラムを呼び出しているシェルを呼出す
$cmd = ‘/var/www/html/cre.sh’;
$out = shell_exec($cmd); ← コマンドの実行結果を表示します。

 

 

 

バッククオートで囲む

バッククオートは「shell_exec」と同じです。

// Rubyプログラムを呼び出しているシェルを呼び出す
$out = `/var/www/html/cre.sh`; ← バッククオートで囲んでいるだけです。

echo $out;

 

 

実際に使用する際はOSの設定も確認する

実際に使用する場合の注意点です。

PHP で Web アプリを作り始めた時は、なかなかうまく動かずにハマりました。

気を付ける点

「うまくコマンドが実行できない」、「プログラムが動作しない」場合は以下の3点を確認しましょう。

何かヒントが見つかるかもしれません。

後ほど説明しますが「tail -F xxx」コマンドでログを出力しながらデバッグをすると原因が特定しやすくなります。

  • パス(PATH)
  • アクセス権
  • 言語(LANG)

 

 

invalid byte sequence in US-ASCII (ArgumentError) エラーについて

プログラムファイル(シェルファイル)に日本語が入っていると、以下のように「invalid byte sequence in US-ASCII (ArgumentError)」が表示されることがあります。

[root@cent07 html]# tail -n 100 /var/log/httpd/error_log
sudo: no tty present and no askpass program specified
/usr/share/ruby/csv.rb:1987:in `=~’: invalid byte sequence in US-ASCII (ArgumentError)
from /usr/share/ruby/csv.rb:1987:in `init_separators’
from /usr/share/ruby/csv.rb:1509:in `initialize’
from /usr/share/ruby/csv.rb:1261:in `new’
from /usr/share/ruby/csv.rb:1261:in `open’
from /usr/share/ruby/csv.rb:1323:in `read’

 

 

シェルファイルは以下のように日本語で記述されていたので、LANG の設定を入れました。

export LANG=ja_JP.UTF-8

 

 

うまくデバッグをする方法

Web アプリを作っている時に、私が一番役に立った「デバッグ方法」です。

単純に「tail」コマンドで Web アプリを動かす時にエラーログ(/var/log/httpd/error_log)を確認しながらデバッグをしていました。

[root@cent07 ~]# tail -F /var/log/httpd/error_log

 

たったこれだけですが、これだけで Web アプリのデバッグが非常に捗りました。

 

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください