読者です 読者をやめる 読者になる 読者になる

phpとか

自分用備忘録なので、自分が分かる程度にしか書いてません。

phpから、非同期でシェルスクリプト(task)起動

画面上からユーザに重い処理をさせたいけど、処理終わるまでブラウザ開きっぱなしは困る。
というかユーザ自身が閉じたり、タイムリミットがあったりで、実行される保証がないですよね・・・

というわけで、phpから非同期でスクリプトを起動する方法をまとめました。

exec('cd ' . TASKSRUN . ';nohup php oil refine testScript' . escapeshellarg($test) .' > /dev/null &'/* '> '.TASKSRUN.'result.log 2> '.TASKSRUN.'err.log' */);
  • ※oilコマンドが打てないって方は、まずoilのインストールをお願いします。
  • ※それが面倒な方やfuelphpを使用しない方は、oilでtask実行でなく、シェルスクリプトの実行にしてください。


【解説】

1.まず、oilコマンドが打てるパスへ移動します。

'cd ' . TASKSRUN . '
  • ※「TASKSRUN」は、oilコマンドが使えるパスをいれた定数です。
  • 通常は、fuelディレクトリが置いてある階層に「oil」があるとおもうので、そこですね。
  • ※escapeshellarg($test)は、スクリプトに渡す引数で、escapeshellarg関数でエンコードしてます。

2.非同期(結果を待たない)にして実行

';nohup php oil refine testScript' . escapeshellarg($test) .'

nohup」をつけると、ログアウト後もコマンドを実行し続けます

3.ログに書き込み

'/* '> '.TASKSRUN.'result.log 2> '.TASKSRUN.'err.log' */

エラーログと実行時のログを別にしてます。
ログいらない方は、コメントアウトしたまま、下記にすれば、ログはできません。

' > /dev/null &'

あとは、読んだスクリプト内で終了フラグをdbとかテキストとかに書き込むようにして、メール通知するなり、
ブラウザ上に表示するなりすればOKかとおもいます。


Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)