Qual è il modo migliore per mantenere uno script PHP in esecuzione come demone?

StackOverflow https://stackoverflow.com/questions/38596

  •  09-06-2019
  •  | 
  •  

Domanda

Qual è il modo migliore per mantenere uno script PHP in esecuzione come demone e qual è il modo migliore per verificare se è necessario riavviarlo.

Ho alcuni script che devono essere eseguiti 24 ore su 24, 7 giorni su 7 e per la maggior parte posso eseguirli utilizzando no.Ma se si interrompono, qual è il modo migliore per monitorarlo in modo che possa essere riavviato automaticamente?

È stato utile?

Soluzione

Se non puoi utilizzare la struttura init (corretta) per farlo (sei su un hosting condiviso, ecc.), usa cron per eseguire uno script (può essere scritto nella lingua che preferisci) ogni pochi minuti che controlla controlla se sono in esecuzione e riavviali se necessario.

Altri suggerimenti

Eseguiamo i nostri demoni trasmettendo l'output alla posta.

php daemon.php | mail -s "daemon stopped" foo@example.org

In questo modo, quando/se il demone si ferma, invierà un'e-mail e verremo avvisati in questo modo.

Ovviamente significa comunque il riavvio manuale dei demoni, ma lo sapremo subito.Di solito, se i demoni si fermano, significa che c'è comunque qualcos'altro di cui occuparsi, quindi di solito va bene.

Cron veloce e sporco per riavviare il tuo demone:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Sostituisci USER con l'utente con cui viene eseguito il demone e SCRIPTNAME con il nome del tuo script.Metti questo dentro /etc/cron.d/restart_php_daemon.Dovrebbe funzionare ogni minuto.Cambia il primo * A */2 O */5 per correre meno frequentemente.

AGGIORNAMENTO

Se lo stai inserendo nel tuo crontab:

Correre crontab -e e aggiungi:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

La soluzione più elegante è phpdaemon O reactPHP.

Ho avuto successo eseguendo un wget e inviando il risultato a /dev/null su un server condiviso.

Daemon è un processo Linux che viene eseguito in background;apache o mysql sono demoni.In un ambiente Linux, possiamo eseguire un programma in background utilizzando cronjob, ma presenta alcune limitazioni e in alcuni scenari non è una buona idea.Ad esempio, utilizzando cronjob, non possiamo controllare se l'esecuzione precedente è già terminata.Spesso è più conveniente eseguire un processo come demone.

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

Il codice sopra è tratto da un ottimo articolo su come creare un demone in php.Puoi leggerlo su collegamento

Utilizzo uno script basato su PHP per leggere da un database e inviare e-mail (utilizzando la libreria PEAR Mail_Queue).Lo eseguo dall'interno di uno script bash e in base al risultato restituito (da "exit $status;") mi fermo, dormi per X secondi o ricomincio immediatamente.(Ho anche inserito un controllo del carico medio/sonno nello script PHP per evitare di stressare il sistema di posta).

Se fosse per un demone a lungo termine che dovesse essere continuamente in esecuzione, allora sono d'accordo, probabilmente non sarebbe la cosa migliore eseguirlo (anche se ho sentito parlare di alcuni server socket che hanno funzionato con successo a lungo termine), tuttavia, PHP 5.3 ora ha anche migliorato la garbage collection e se lo script è scritto abbastanza bene da non uscire in modo non pianificato, la memoria dovrebbe essere molto meno un problema di prima.

Sono d'accordo che PHP non è lo strumento migliore per questo, tuttavia posso capire perché desideri utilizzare PHP in modo da poter riutilizzare componenti della tua applicazione come l'accesso al database e così via.

Ho avuto un problema simile e ho finito per sviluppare The Fat Controller che è un demone scritto in C in grado di eseguire script PHP.Può anche essere eseguito come demone multithread, eseguendo molte istanze di uno script in parallelo.

Ulteriori informazioni e casi d'uso sono disponibili qui: http://www.4pmp.com/fatcontroller/

TBH, PHP probabilmente non è lo strumento migliore per questo, in realtà non è quello per cui è stato progettato.Ho sentito parlare di perdite di memoria e di altre cose brutte che accadono quando lo provi.Tieni inoltre presente che PHP ha solo una quantità finita di ID di risorsa (per handle di file, connessioni db ecc.) per esecuzione di uno script.

È meglio usare qualcos'altro, forse Python o Perl, anche se non ho alcuna esperienza reale nella scrittura di questo tipo di app, ma so che PHP non è adatto a quello che stai cercando di fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top