Windowsでも非同期でexec()

<?php
function exec_async($command)
{
	if (PHP_OS !== 'WIN32' && PHP_OS !== 'WINNT') {
		exec($command . ' >/dev/null 2>&1 &');
	}
	else {
		$fp = popen('start "" ' . $command, 'r');
		pclose($fp);
	}
}

解説

  • PHP_OS で WindowsUNIX 系 OS かを判断する(他の処理系については考えていない)
  • UNIX 系 OS の場合、標準出力を /dev/null に捨て、バックグラウンドで実行 (&) することで非同期実行になる(念のため標準エラー出力も捨てている)
  • Windows では popen() でプロセスを作り、start コマンドで実行することで非同期になる
  • start コマンドの第一引数に "〜" で囲われた文字列がある場合、ウィンドウ タイトルとして認識される。そのためここでは空のタイトルを設定してコマンドがタイトルとして認識されることを防いでいる