2013-10-23 17 views
7

Attualmente la mia soluzione è:PHP: come avviare un processo distaccato?

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

e in file.php

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

C'è un modo che io possa fare questo solo con exec?

+0

Io non la penso così. Forse l'esempio posix_setsid può aiutare, ma usa fork(). –

risposta

5

No questo non può essere fatto con exec() (né shell_exec() o system())


se avete la pcntl extension installato sarebbe:

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; 
    } 
} 

chiamare in questo modo:

$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

Non voglio demonizzare il processo né ho bisogno di biforcare. Ho solo bisogno di avviare un altro processo php che non riceverebbe SIGINT quando uscirà colui che lo ha creato. (Non sono davvero sicuro di come un daemon sia diverso da un processo che è staccato dal terminale?) – Dalius

+0

Controlla di nuovo il mio esempio. Non è quello che vuoi? ;) L'unica differenza con un demone è che non viene eseguito per sempre ma verrà eliminato all'uscita di padri. – hek2mgl

+0

Fondamentalmente sì, ma prova ad implementarlo in una semplice funzione che restituisce vero o falso. (NON DEVE bloccare). E non voglio che il nuovo processo venga ucciso, uscirà da solo. – Dalius

5

A condizione che il tuo utente corrente abbia autorizzazioni sufficienti per fare ciò dovrebbe essere possibile con exec e allo stesso modo:

/* 
/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

Si prega di fare ** non ** fare questo mai più: http://stackoverflow.com/review/suggested-edits/3201462 Questo non è assolutamente come Stack Overflow funziona. Sei in un modo, ** a modo ** fuori linea, cancellando la risposta di qualcun altro e indicando la risposta ai tuoi. – meagar

+0

Scuse: nessun gioco di parole. Ero sotto l'impressione di S.O. è stato molto serio sul fatto di non avere informazioni errate qui, quindi ho semplicemente suggerito di rimuovere le informazioni di hek2mgl che questo non potrebbe essere fatto con la funzione exec(). – Philzen

+2

Il voto è il modo in cui ordiniamo i contenuti qui. – meagar

Problemi correlati