execで外部コマンドを実行する
簡単な例
1 |
exec(実行するコマンド,実行の結果,実行のステータス) |
phpからwindowsのプログラムなどやpythonのプログラムを実行する。
dirコマンドを実行して、戻りを表示させてみます。
web.php
1 2 3 |
Route::get('dir', function () { return view('dir'); }); |
dir.brade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <?php echo "<pre>\n"; print_r(mb_get_info()); echo "</pre>\n"; echo("これはUTF8です。"); <span style="color: #ff0000;"> exec('dir', $out, $rtn);</span> print_r( mb_convert_encoding($out, 'UTF-8', 'SHIFT_JIS') ); echo "<br />"; echo $rtn; ?> </body> </html> |
print_r(mb_get_info());
マルチバイト環境の設定を確認
mb_convert_encoding($out, ‘UTF-8’, ‘SHIFT_JIS’)
Windows系の出力をUTF-8へ変換しながら、Web出力させます。
結果
Pythonプログラムを処理する具体例
コントローラ内で処理する事とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HogeController extends Controller { public function form() { return view('hoge.form'); } public function confirm(Request $request) { $input = $request->all(); // $inputにpostのデータ入ってる $cmdPath = 'C:\ProgramData\Anaconda3\python.exe C:\var\www\ecpink\qr-code\qqqcode.py'; exec($cmdPath,$outputData,$result); var_dump($outputData); var_dump($result); return view('hoge.confirm',compact('input')); } } |
出力値
array(0) { } int(0)
上記はqqqcode.pyを起動する例です。
qqqcode.py(C:\var\www\ecpink\qr-code)
1 2 3 4 |
# QRコードを生成 import qrcode img = qrcode.make('https://www.yahoo.co.jp/:採点すると100点満点の1000点――。') img.save('qrcode.png') |
qrcode.pngはC:\var\www\ecpink\mylog\publicにできました。
注意点
私の環境では、$cmdPath = ‘C:\ProgramData\Anaconda3\python.exe C:\var\www\ecpink\qr-code\qqqcode.py’;のようにフルパス指定、かつ、$cmdPathへ実行パラメータを記述して、exec()を処理しなければ、エラーが戻って来ました。
Pythonの場所
1 2 |
C:\var\www\ecpink\mylog>where python C:\ProgramData\Anaconda3\python.exe |