PHP(Laravel)からPythonを呼び出して実行する方法の解説

  • 2020.01.24
  • PHP
PHP(Laravel)からPythonを呼び出して実行する方法の解説
                 
最終更新日から90日以上経過しています。

PHP(Laravel)を勉強して、込み入った処理を別プログラムで外出ししようと思ったのですが、実現まで少し戸惑った為、復習/シェアを目的に記事を書きます。

調べたところ後述の2通りの方法があるようでしたが、外部ライブラリを使用する方法は問題があり断念。

結果から言えば外部ライブラリを使用せずに実現できました。依存の管理の面からもその方が嬉しいので結果オーライです。

exec関数を使うかsymfony/processを使うか

今回はexec関数を使う方法を解説

PHP(Laravel)からPythonを実行する方法は幾つかあり、手を出しやすい所だと以下の2通りあります。
※その他の方法があれば随時追記します。

  1. PHP組み込み関数のexec関数を使用する
  2. 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>

 

PHPカテゴリの最新記事