LoginSignup
40
38

More than 5 years have passed since last update.

それ本当に並列処理になってる?

Last updated at Posted at 2016-01-11

はじめに

PHPからシェルコマンドを利用する際、&をつけるだけでは並列実行にならない場合があるのでメモしておきます。

  • exec shell_exec systemは同じ特徴を持つものとして考えて、execのみを用いて検証します。
  • popen proc_openは同じ特徴を持つものとして考えて、popenのみを用いて検証します。
  • >&2 >/dev/nullは同じ特徴を持つものとして考えて、>&2のみを用いて検証します。

今回はOSX環境を用います。Linux環境でもおそらく同様ですが、Windows環境では大きく結果が変わることが予想されるので、環境を用意出来る方は検証していただけると助かります。

実験

以下に組み合わせ条件を示します。for文の中で3,4回程度繰り返し実行し、かかった合計時間で並列実行されたかを判定します。

  • execを使うか?popenを使うか?
  • &をつけるか?つけないか?
  • >&2をつけるか?つけないか?

結果

並列実行された

A
exec('php -r "sleep(1);" >&2 &');
B
popen('php -r "sleep(1);" &', 'rb');
C
popen('php -r "sleep(1);" >&2 &', 'rb');

並列実行されなかった

D
exec('php -r "sleep(1);"');
E
exec('php -r "sleep(1);" &');
F
exec('php -r "sleep(1);" >&2');
G
popen('php -r "sleep(1);"', 'rb');
H
popen('php -r "sleep(1);" >&2', 'rb');

考察

どうですか?Eが並列実行されないのは意外じゃないでしょうか?尤も、Eのようなコードを書いて並列実行を謳っているようなQiita記事を見かけることが何度かあったので、今回の投稿をさせていただいた、というところです。

なおBに関しても、バッファが消化されずに溜まり続けるという問題がありそうです。AC、しいて言えばAが一番無難な書き方でしょう。逆に結果の読み出しが必要になる場合はBも有効な選択肢になってくると言えそうです、この場合はpopenではなくproc_open必須になりますが…

40
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
38