PHP(Laravel)を勉強して、込み入った処理を別プログラムで外出ししようと思ったのですが、実現まで少し戸惑った為、復習/シェアを目的に記事を書きます。
調べたところ後述の2通りの方法があるようでしたが、外部ライブラリを使用する方法は問題があり断念。
結果から言えば外部ライブラリを使用せずに実現できました。依存の管理の面からもその方が嬉しいので結果オーライです。
exec関数を使うかsymfony/processを使うか
今回はexec関数を使う方法を解説
PHP(Laravel)からPythonを実行する方法は幾つかあり、手を出しやすい所だと以下の2通りあります。
※その他の方法があれば随時追記します。
- PHP組み込み関数のexec関数を使用する
- symfony/processライブラリを使用する
今回は1の方法による解説になります。
最初は2の方法で試みましたが、ライブラリのインストール時に、Laravelのバージョンとライブラリの対応の関係でエラーとなってしまい断念しました。
尚、2の方法については以下を参考にしました。
exec関数を使ってPythonを呼び出す
exec関数について
exec関数はPHPの組み込み関数で、外部プログラムを実行できる関数です。第一引数にコマンド、第二引数にコマンドからの出力、第三引数にコマンドのステータスが設定されます。
詳細は公式によるリファレンス参照のこと。
- 第一引数は、相対パスではなく、絶対パスを指定する。
- 第二引数は、戻り値ではなくコマンドからの出力が設定される。
(今回はPythonを呼び出すのでprint()等の出力)
PHP(Laravel)側にPythonを呼び出す処理を追加
ポイントとなる部分のみ抜粋して記載します。
といっても注意するのは呼び出し先のプログラムへのパスを正しく指定することくらい。
web.php
指定のURLへのルーティングを設定する。
Route::post('/python', 'ExecController@executePython');
ExecController.php
web.phpからのルーティングを受けて実行する処理を記載する。
ここで外部プログラムを呼び出します。今回は呼び出し先にカレントパスを引数として渡していますが、もちろん不要であれば削除して問題なし。
public function executePython(Request $request) { $current = "\\[PATH]\\[TO]\\[EXECUTE_PROGRAM]\\"; $path = $current . "sample.py " . $current; $command = "python " . $path; exec($command, $output); }
sample.blade.php
web.phpで指定したルーティングへのsubmit処理を記載。
<form action="python" method="POST"> @csrf <input type="submit" name="submit"> </form>