明明 PHP 就是常常搭配 Apache HTTP Server 透過瀏覽器直接執行的程式語言,那為什麼又需要用到背景執行呢?

這個理由是因為我把 PHP 當作像 Perl 、bash、csh 等 script 語言來使用,然而,當這個 script 需要花費大量的時間處理時,背景執行就是個不錯的選擇。

我以為寫一個小網頁用 shell_exec( '/usr/local/bin/php /tmp/test.php &' ); 的方式就能搞定,但試了很久並沒有那種效果,最後我發現必須把輸出導向才行!

  • shell_exec( '/usr/local/bin/php /tmp/test.php > /tmp/cmd_out &' );

另外,也可以直接用 ` 來執行

  • `/usr/local/bin/php /tmp/test.php > /tmp/cmd_out &`

至於 Windows 上則是可以使用類似下面的方式

  • pclose(popen("start /B C:\php\php.exe > C:\temp\out", "r") );

看來我寫的程式架構又可以再更新一下了!

2010/01/24 更新!

關於 Windows 的運行方式,如果 Web Server 只有一支 process 還是會有問題,請參考 Executing background processes from PHP on Windows ,可改成

<?php
$cmd = 'C:\php\php.exe C:\test.php' ;
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /C $cmd", 0, false);
?>

其中 cmd /C 的部份,可以自行在 Windows 下的 cmd mode 打入 cmd /? 可看看說明囉!至於 WScript.Shell 執行時所帶的參數意義,可以到 Run Method (Windows Script Host) 查看。

相較於之前的 "start /B ..." ,原先在 taskmgr 會看到有一支 php.exe 在運行,改成新的方式後,會再多一支 cmd.exe 囉


changyy 發表在 痞客邦 PIXNET 留言(0) 人氣()