tag Esegui script php come processo daemon




start php code (8)

Ho bisogno di eseguire uno script php come processo daemon (attendere le istruzioni e fare cose). cron job non lo farà per me perché le azioni devono essere intraprese non appena arrivano le istruzioni. So che PHP non è davvero la migliore opzione per i processi demone a causa di problemi di gestione della memoria, ma a causa di vari motivi devo usare PHP in questo caso. Mi sono imbattuto in uno strumento di libslack chiamato Daemon ( http://libslack.org/daemon ) che mi aiuta a gestire i processi demone, ma non ci sono stati aggiornamenti negli ultimi 5 anni, quindi mi chiedo se ne sai qualcosa altre alternative adatte al mio caso. Qualsiasi informazione sarà molto apprezzata.

https://code.i-harness.com


C'è più di un modo per risolvere questo problema.

Non conosco le specifiche ma forse c'è un altro modo per attivare il processo PHP. Ad esempio, se è necessario eseguire il codice in base agli eventi in un database SQL, è possibile impostare un trigger per eseguire lo script. Questo è veramente facile da fare sotto PostgreSQL: http://www.postgresql.org/docs/current/static/external-pl.html .

Onestamente penso che la cosa migliore da fare sia creare un processo Damon usando nohup. nohup consente al comando di continuare a essere eseguito anche dopo che l'utente si è disconnesso:

nohup php myscript.php &

C'è tuttavia un problema molto serio. Come hai detto, il gestore della memoria di PHP è una spazzatura completa, è stato costruito partendo dal presupposto che uno script è in esecuzione solo per pochi secondi e quindi esiste. Lo script PHP inizierà a utilizzare GIGABYTES della memoria solo dopo pochi giorni. È inoltre NECESSARIO creare uno script cron che funzioni ogni 12 o forse 24 ore per uccidere e ricreare il tuo script php in questo modo:

killall -3 php
nohup php myscript.php &

Ma cosa succede se la sceneggiatura era nel bel mezzo di un lavoro? Bene kill -3 è un interrupt, è come fare un ctrl + c sulla CLI. Lo script php può catturare questo interrupt ed uscire con garbo usando la libreria pcntl di PHP: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

Ecco un esempio:

function clean_up() {
  GLOBAL $lock;
  mysql_close();
  fclose($lock)
  exit();
}
pcntl_signal(SIGINT, 'clean_up');

L'idea alla base del blocco $ è che lo script PHP può aprire un file con un fopen ("file", "w") ;. Solo un processo può avere un blocco di scrittura su un file, quindi usando questo puoi essere sicuro che solo una copia del tuo script PHP è in esecuzione.

In bocca al lupo!


Come altri hanno già menzionato, l'esecuzione di PHP come demone è abbastanza semplice e può essere eseguita utilizzando una singola riga di comando. Ma il vero problema è tenerlo in esecuzione e gestirlo. Ho avuto lo stesso problema un po 'di tempo fa e sebbene ci siano già molte soluzioni disponibili, molte di esse hanno molte dipendenze o sono difficili da usare e non sono adatte per gli usi di base. Ho scritto uno script di shell in grado di gestire qualsiasi processo / applicazione inclusi gli script cli di PHP. Può essere impostato come cronjob per avviare l'applicazione e conterrà l'applicazione e gestirla. Se viene eseguito di nuovo, ad esempio tramite lo stesso cronjob, controlla se l'app è in esecuzione o meno, se invece esce semplicemente e lascia che la sua istanza precedente continui a gestire l'applicazione.

L'ho caricato su github, sentitevi libero di usarlo: https://github.com/sinasalek/EasyDeamonizer

EasyDeamonizer

Controlla semplicemente la tua applicazione (avvia, riavvia, registra, monitora, ecc.). uno script generico per assicurarti che la tua app resti funzionante correttamente. Intenzionalmente usa il nome del processo instread del file pid / lock per prevenire tutti i suoi effetti collaterali e mantenere lo script il più semplice e il più agevole possibile, quindi funziona sempre anche quando EasyDaemonizer stesso viene riavviato. Caratteristiche

  • Avvia l'applicazione e opzionalmente un ritardo personalizzato per ogni avvio
  • Si assicura che solo una istanza sia in esecuzione
  • Monitora l'utilizzo della CPU e riavvia automaticamente l'app quando raggiunge la soglia definita
  • Impostazione di EasyDeamonizer da eseguire tramite cron per eseguirlo di nuovo se viene interrotto per qualsiasi motivo
  • Registra la sua attività

Controlla https://github.com/shaneharter/PHP-Daemon

Questa è una libreria daemon orientata agli oggetti. Ha un supporto integrato per cose come la registrazione e il ripristino degli errori, e ha il supporto per la creazione di background worker.


Corro un gran numero di demoni PHP.

Sono d'accordo con te sul fatto che PHP non è il miglior linguaggio (o anche un buon) per farlo, ma i demoni condividono il codice con i componenti che affrontano il web, quindi nel complesso è una buona soluzione per noi.

Usiamo daemontools per questo. È intelligente, pulito e affidabile. In effetti lo usiamo per gestire tutti i nostri demoni.

Puoi verificarlo su daemontools .

EDIT: un rapido elenco di funzionalità.

  • Avvia automaticamente il daemon al riavvio
  • Avvia automaticamente dameon in caso di errore
  • La registrazione viene gestita per te, incluso il rollover e la potatura
  • Interfaccia di gestione: "svc" e "svstat"
  • UNIX friendly (non un vantaggio per tutti forse)



Puoi iniziare lo script php dalla riga di comando (es. Bash) usando

nohup php myscript.php &

il & mette il tuo processo in background.

Modificare:
Sì, ci sono alcuni inconvenienti, ma non è possibile controllarli? È semplicemente sbagliato.
Un semplice kill processid lo fermerà. Ed è ancora la soluzione migliore e più semplice.


Se puoi, prendi una copia di Programmazione avanzata nell'ambiente UNIX . L'intero capitolo 13 è dedicato alla programmazione daemon. Gli esempi sono in C, ma tutte le funzioni di cui hai bisogno hanno wrapper in PHP (fondamentalmente le estensioni pcntl e posix ).

In poche parole - scrivere un demone (questo è posible solo su sistemi operativi basati su * nix - Windows usa servizi) è come questo:

  1. Chiama umask(0) per evitare problemi di autorizzazione.
  2. fork() e ha l'uscita genitore.
  3. Chiama setsid() .
  4. L'elaborazione del segnale di installazione di SIGHUP (solitamente questa viene ignorata o utilizzata per segnalare al demone di ricaricare la sua configurazione) e SIGTERM (per dire al processo di uscire con garbo).
  5. fork() nuovo e ha l'uscita genitore.
  6. Cambia la directory di lavoro corrente con chdir() .
  7. fclose() stdin , stdout e stderr e non scrivono loro. Il modo corretto è quello di reindirizzare quelli a /dev/null o un file, ma non sono riuscito a trovare un modo per farlo in PHP. È possibile quando si avvia il demone per reindirizzarlo usando la shell (dovrai scoprire come farlo, non lo so :).
  8. Fai il tuo lavoro!

Inoltre, dal momento che stai usando PHP, fai attenzione ai riferimenti ciclici, dato che il garbage collector di PHP, precedente a PHP 5.3, non ha modo di raccogliere quei riferimenti e il processo perderà memoria, fino a quando non si blocca.





daemon