2013-10-23 21 views
7

Obecnie moje rozwiązanie to:PHP: jak rozpocząć oddzielny proces?

exec('php file.php >/dev/null 2>&1 &'); 

aw file.php

if (posix_getpid() != posix_getsid(getmypid())) 
    posix_setsid(); 

jest jakiś sposób mogę to zrobić tylko z exec?

+0

Nie sądzę. Może on posix_setsid przykład może pomóc, ale używa fork(). –

Odpowiedz

5

No nie da się tego zrobić z exec() (NOR shell_exec() lub system())


Jeśli zainstalowano pcntl extension byłoby:

function detached_exec($cmd) { 
    $pid = pcntl_fork(); 
    switch($pid) { 
     // fork errror 
     case -1 : return false 

     // this code runs in child process 
     case 0 : 
      // obtain a new process group 
      posix_setsid(); 
      // exec the command 
      exec($cmd); 
      break; 

     // return the child pid in father 
     default: 
      return $pid; 
    } 
} 

Nazwijmy to tak:

$pid = detached_exec($cmd); 
if($pid === FALSE) { 
    echo 'exec failed'; 
} 

// do some work 

// kill child 
posix_kill($pid, SIGINT); 
waitpid($pid, $status); 

echo 'Child exited with ' . $status; 
+0

Nie chcę demonfigurować procesu ani go rozgałęziać. Muszę tylko uruchomić inny proces php, który nie otrzyma SIGINT, gdy ten, kto go utworzył, zakończy pracę. (Nie jestem pewien, jak demon różni się od procesu odłączonego od terminala?) – Dalius

+0

Sprawdź ponownie mój przykład. Czy tego nie chcesz? ;) Jedyną różnicą dla demona jest to, że nie działa on wiecznie, ale zostanie zabity przy wyjściu ojca. – hek2mgl

+0

Zasadniczo tak, ale spróbuj wdrożyć to w prostej funkcji, która zwraca wartość true lub false. (NIE MUSI się blokować). I nie chcę, aby nowy proces został zabity, to się skończy. – Dalius

5

Pod warunkiem, że obecny użytkownik ma wystarczające uprawnienia, aby to zrobić, powinno być możliwe z exec i podobnie:

/* 
/Start your child (otherscript.php) 
*/ 
function startMyScript() { 
    exec('nohup php otherscript.php > nohup.out & > /dev/null'); 
} 

/* 
/Kill the script (otherscript.php) 
/NB: only kills one process at the time, otherwise simply expand to 
/loop over all complete exec() output rows 
*/ 
function stopMyScript() { 
    exec('ps a | grep otherscript.php | grep -v grep', $otherProcessInfo); 
    $otherProcessInfo = array_filter(explode(' ', $otherProcessInfo[0])); 
    $otherProcessId = $otherProcessInfo[0]; 
    exec("kill $otherProcessId"); 
} 

// ensure child is killed when parent php script/process exits 
register_shutdown_function('stopMyScript'); 

startMyScript(); 
+5

Proszę nie ** nigdy nie rób tego nigdy więcej: http://stackoverflow.com/review/suggested-edits/3201462 To nie jest absolutnie jak Stack Przepełnienie działa. Jesteś drogi, ** droga ** z linii, przekreślając cudzą odpowiedź i wskazując swoją odpowiedź na swoją. – meagar

+0

Przeprosiny - gra słów nie jest przeznaczona. Byłem pod wrażeniem S.O. bardzo poważnie podchodziło do tego, że nie mam tutaj niepoprawnych informacji, więc zasugerowałem jedynie usunięcie informacji hek2mgl, że nie można tego zrobić przy pomocy funkcji exec(). – Philzen

+2

Głosowanie to sposób sortowania treści tutaj. – meagar

Powiązane problemy