コンテンツにスキップ

Top

Windows の php で コマンドの実行をバックグラウンド(非同期)で実施する

php で コマンドを実行する方法と、それをバックグラウンドで実行する方法について述べる。

php で コマンドなどを実施したい場合、まっさきに思いつくのがexecですね。
以下を実施するとカレントにa.txtが生成されます。

<?php
    exec('type nul > a.txt');
?>

が、exec関数だとバックグラウンド実行にはできないんです。

Windowsでコマンドをバックグラウンド実行する場合、 start /b (Linuxでいう&)をつければよいのですが、exec関数内でstart /bをつけたところでバックグラウンド実行にはなりません。

具体的には時間のかかるtimeoutをやってみましょう。

<?php
    exec('start /b timeout 10');
?>
普通ならstrat /b なのですぐにプロンプトが戻ってくるはずですが固まったままです。

exec関数の場合、start /b が有効にならないのです。

ではどうしたらよいでしょうか?同じようにコマンドを実施できる popenを使えばよいのです。

<?php
    pclose(popen('start /b timeout 10', 'r'));
?>

のようにすると問題なくバックグラウンドで実施されました!

まぁ戻りを待ったりできないし、あんまり使いどころもないかもしれないですが。

以上!