それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PHPのコマンド実行関数の違い、比較してみよう

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 は入出力のパイプを事前に渡せる.

シンプルさ順で並べた

一番シンプルなモノから。

  1. shell_exec または``
  2. system
  3. exec
  4. passthru
  5. 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 を追加