unlink で数GBのファイル消していると遅い
php のプロセス実行コマンドでバックグラウンド実行しよう。
とおもった。見渡せばプロセス実行関数は、たくさんあった。どれを使うべき?比較してみよう
コマンド実行系コマンド
shell_exec | コマンド実行する。出力はStringへ。 `` 演算子と同じ。shell 経由でコマンド実行 | |
sytem | コマンド実行する。出力はStringへ。ステータスコードはArrayへ | |
exec | コマンドを実行する。出力はStringへ。ステータスコードなどはArrayへ | |
proc_open | STDIN/STDOUT を指定する。 | |
passthru | exec と同じ。出力が直接ブラウザへ行く。バイナリやストリーム返したいときに使う | |
pcntl_exec | posix の process control で exec する。左の意味が分かる人だけ |
お馴染みのバッククォート演算子【`】は shell_exec 相当
ステータスコードは、プログラムが正常終了したか
Arrayには標準出力とエラー出力が入ってくる。
proc_open は入出力のパイプを事前に渡せる.
シンプルさ順で並べた
一番シンプルなモノから。
- shell_exec または``
- system
- exec
- passthru
- proc_open
と言うわけで基本的には shell_exec でよろしい。
shell経由で実行するとは?
shell_execはシェル経由で実行される
` ls `
これは
bash -c ' ls '
として実行されると思えばいい(。
バックグラウンドのプロセス起動したいとき
バックグラウンドプロセスを起動できます.
`ping 192.168.2.1 > /dev/null & `
このように終了しないコマンドを発行できます。
但し、pnctl 系関数が使えるとき、に限ります.
`コマンド名 > /dev/null & `
これでバックグラウンドに渡したいコマンドを渡すことができる。
実際やってみた
epgrec のWEBからTSファイル消す作業に時間が掛かって、レスポンスが遅いのでUnlinkをバックプロセス起動にしてレスポンス時間を稼ぐことにする。
@unlink("filename");
を
`rm filename > /dev/null &`;
に変更した。バックプロセスで処理して,WEBへのレスポンスは改善したAjaxみたいにUIにカラム部分はバックグラウンドにした方が良いん。だけど連続してプロセス起動すると怖いよねぇ。
あまり長時間終わらないプロセスも困るよね。
2018/03/03
pcntl_exec を追加