2010-09-29 13 views
49

Ho un comando che voglio eseguire, ma non voglio che PHP si sieda e aspetti il ​​risultato.comando php exec (o simile) per non attendere il risultato

<?php 
echo "Starting Script"; 
exec('run_baby_run'); 
echo "Thanks, Script is running in background"; 
?> 

E 'possibile avere PHP non attendere il risultato .. vale a dire appena calci fuori e si muovono lungo al comando successivo.

Non riesco a trovare nulla e non sono sicuro che sia possibile. Il meglio che ho potuto trovare era qualcuno che faceva un lavoro CRON per iniziare in un minuto.

+1

Se dovete fare questo di frequente, si potrebbe anche essere interessato a un [JobQueue, come Gearman] (http://de2.php.net/manual/en/book.gearman.php). – Gordon

risposta

38

È possibile eseguire il comando in background con l'aggiunta di un & alla fine di esso come:

exec('run_baby_run &'); 

Ma fare solo questo appendere la sceneggiatura perché:

Se un programma è iniziato con la funzione exec, per poter continuare a funzionare in background, l'output del programma deve essere reindirizzato a un file o un altro flusso di output. Non riuscendo a farlo causerà il blocco di PHP fino al termine dell'esecuzione del programma.

Quindi è possibile reindirizzare lo stdout del comando in un file, se si desidera visualizzare in un secondo momento o per /dev/null se si vuole eliminarlo come:

exec('run_baby_run > /dev/null &'); 
+0

che ha funzionato alla grande, grazie per il tuo aiuto. – greg

+0

Grazie, signore. Questo funziona perfettamente. –

+0

Non reindirizza lo stderr e viene ucciso da un server web in crash. –

80

E 'sempre bene check the documentation:

al fine di eseguire un comando have have non appendere il vostro script php mentre viene eseguito, il programma si esegue non deve uscita posteriore al php. Per fare ciò, reindirizza sia stdout che stderr su/dev/null, quindi esegui lo sfondo.

>/dev/null 2>&1 &

Per eseguire un comando ottenendo che ha generato il quale un altro processo che non dipende filettatura apache per mantenere in esecuzione (non moriranno se qualcuno annulla pagina) run questo:

exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');

+0

Grazie mille! Ci sono molte "soluzioni" che in realtà non funzionano (il thread principale del browser è ancora in attesa). Molte soluzioni parlano solo del "&" alla fine, che non è sufficiente. Detto questo, per me è stata una soluzione più semplice: exec ('nohup your_command>/dev/null 2> & 1 &') era abbastanza. –

+0

Perché non è necessario portare anche 'stdin' a/dev/null? L'input di un processo collegato a una shell sarà sufficiente per impedire a "nohup" di "rinnegare" il processo figlio? (Cambiano 'stdin' in questa risposta: http://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entely) – NHDaly

+0

anche, perché chiamate entrambi' nohup' e 'setsid'? Non riesco a trovare molte informazioni su quale sia migliore o su come sono differenti .. (http://stackoverflow.com/questions/10247721/on-writing-a-linux-shell-script-to-safely-detach- programmi-da-un-terminale) – NHDaly

0

"exec nohup setsid your_command"

il nohup permette your_command di continuare anche se il processo che ha lanciato può terminare prima. Se lo fa, il segnale SIGNUP verrà inviato a your_command causandone la chiusura (a meno che non rilevi quel segnale e lo ignori).

+0

Secondo [questa risposta] (https://stackoverflow.com/a/284443/819417), un bambino deve iscriversi a SIGHUP per essere informato della morte del genitore. Tuttavia, un terminale tende ad inviare il segnale HUP all'uscita. –

6

Ok, ecco la corretta premiato risposta definitiva finale ;-)

Questo utilizza wget per notificare un URL di qualcosa senza aspettare.

$command = 'wget -qO- http://test.com/data=data'; 
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid); 

Questo utilizza ls per aggiornare un registro senza attendere.

$command = 'ls -la > content.log'; 
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid); 
+3

Penso che manchi un simbolo '&' tra '2> & 1' e' echo', ho ragione? –

+0

Nohup mantiene anche il bambino in esecuzione se il genitore viene ucciso? –

+0

@santiagoarizti si, l'ho risolto in quanto il codice non funzionava altrimenti –

Problemi correlati