puścić coś w tle
Chcę móc uruchomić proces w tle za pomocą przeglądarki. Docelowo wszystko będzie działać na linkuksie, ale do testów przydałoby się to mieć u siebie. W linkuksie wiem.
costam &
uruchamia proces w tle, potem fajnie mogę sobie zarządzać
jobs
. Ale ja chcę w Windows. Windows Vista, żeby nie było niedomówień. Wywołanie komendy przez exec działa, ale czeka na zakończenie, a nie o to chodzi. Proces ma działać długo, a ja tylko chcę monitorować jego stan, a nie zamulać Firefoksa.
exec("start /b c:/sciezka_do_php/php.exe C:/sciezka_do_skryptu_procesu/bgproces.php > test.txt");
Próbowałem też uruchomić jakiś batch (costam.bat), który z kolei miałby uruchomić skrypt PHP, ale to też nie zadziałało – cały czas przeglądarka czekała na zakończenie całego procesu. Rozwiązanie jest takie, że w PHP na Windows trzeba użyć klasy COM, czyli windowsowych mechanizmów OLE (Object Linking and Embedding). Wygląda to tak:
< ?php /* * skrypt do uruchomienia w tle skryptTla.php */ $fname = 'c:/log.html'; for($i=0; $i<10; $i++){ sleep(1); file_put_contents($fname, date('H:i:s') . '<br/>', FILE_APPEND); } file_put_contents($fname, '<hr />', FILE_APPEND); ?>
< ?php /** * skrypt widziany przez przeglądarkę */ echo "uruchamiam " . date('H:i:s '); if(isset($_SERVER['PWD'])) { // $cmd = '....'; $nullResult = "php $cmd > /dev/null &"; }else{ $cmd = 'sciezka_do_php/php.exe sciezkaSkryptuDoUruchomieniaWTle/skryptTla.php'; $ws = new COM("WScript.Shell"); $oExec = $ws->Run($cmd, 0, false); } echo " koniec " . date('H:i:s '); echo " OK "; ?>