Domanda

Vorrei creare un processo in background e mi è stato detto che di solito sono scritti in C o qualcosa del genere. Recentemente ho scoperto che PHP può essere usato per creare un demone e speravo di ottenere qualche consiglio se dovessi usare PHP in questo modo.

Ecco i miei requisiti per un demone.

  • Controlla continuamente se c'è stata una riga aggiunto alla tabella del database MySQL
  • Esegui i comandi FFmpeg su ciò che era recuperato dal database
  • Inserisci l'output nella tabella MySQL

Non sono sicuro di cos'altro posso offrire per aiutare a prendere questa decisione. Solo per aggiungere, non ho mai fatto C prima. Solo Java e PHP e script bash di base.

Fa davvero molta differenza nelle prestazioni?

Per favore, consenti alla mia ignoranza, sto imparando! :)

Grazie a tutti

È stato utile?

Soluzione

Come altri hanno notato, varie versioni di PHP hanno problemi con i loro garbage collector. Naturalmente, se sai che la tua versione non ha tali problemi, elimini quel problema. Il punto è che non non lo sai (di sicuro) fino a quando non scrivi il demone ed eseguilo attraverso valgrind per vedere se il PHP installato perde o meno su una determinata macchina. Quindi, da quel lato, puoi scriverlo solo per scoprire che ciò che Zend pensa sia riparato potrebbe essere ancora difettoso, o hai a che fare con una versione leggermente più vecchia di PHP o con qualche estensione. Icky.

L'altro problema sono segnali in qualche modo buggy. Nella mia esperienza, i gestori di segnali non sono sempre inseriti correttamente con PHP, specialmente quando il segnale è messo in coda anziché unito. Questo potrebbe non essere un problema per te, cioè se hai solo bisogno di gestire SIGINT / SIGUSR1 / SIGUSR2 / SIGHUP.

Quindi, suggerisco:

Se il demone è semplice, vai avanti e usa PHP. Se sembra che diventerà piuttosto complesso, o allocherà molta memoria, potresti considerare di scriverlo in C dopo averlo prototipato in PHP.

Sono una persona abbastanza dura da morire. Tuttavia, non vedo nulla di male nel martellare qualcosa in fretta usando PHP (al di là dei casi che ho spiegato). Inoltre, non vedo nulla di sbagliato nell'utilizzo di PHP per prototipare qualcosa che potrebbe o non può essere riscritto in seguito in C. Ad esempio, gestire le cose del database sarà molto più semplice se si utilizza PHP, rispetto alla gestione di callback utilizzando altre interfacce in C. Quindi in quell'istanza, per un "una tantum", lo farai sicuramente molto più velocemente.

Altri suggerimenti

Sarei propenso a svolgere questo compito con un lavoro cron, piuttosto che eseguire il polling del database in un demone.

È probabile che il tuo comando FFmpeg impiegherà un po 'di tempo a fare le cose, giusto? In tal caso, è davvero necessario eseguire costantemente il polling del database? Un cronjob in esecuzione ogni minuto (o ogni cinque, dieci o venti minuti per quella materia) sarebbe un modo più semplice per ottenere la stessa cosa?

Php non è migliore o peggiore di questo genere di cose rispetto a nessuno degli altri linguaggi di scripting comuni. Ha un accesso abbastanza completo a tutte le chiamate di sistema e alle utilità di libreria necessarie per eseguire questo tipo di lavoro. Se ti senti più a tuo agio con PHP per lo scripting, allora php farà il lavoro per te.

L'unico lato negativo è che php non è così onnipresente come, diciamo, perl o python, che è installato su quasi tutti i gusti di unix. Php si trova solo su sistemi che offriranno contenuti web dinamici. Non che un interprete Php sia troppo grande o costoso da installare anche, ma se la tua più grande preoccupazione è portare il tuo programma su molti sistemi, questo potrebbe essere un piccolo ostacolo.

Sarò contrario e ti consiglio di provare il demone php. Apparentemente è la lingua che conosci meglio. Presumibilmente incorporerai un timer in ogni caso, quindi puoi duplicare la frequenza di query sul database. Non c'è davvero alcuna penalità fintanto che non si esegue un ciclo ingenuo su una query.

Se qualcosa non viene eseguito frequentemente, puoi in alternativa eseguire php da cron, lasciando che il tuo codice svuoti la coda e poi muoia.

Ma non aver paura di rimanere con ciò che conosci meglio, come prima approssimazione.

Cerca di non usare i trigger. Imporranno un accoppiamento non necessario e non sono divertenti da testare ed eseguire il debug.

Un problema con la corretta demonizzazione di uno script PHP è che PHP non ha interfacce per i syscalls dup () o dup2 (), che sono necessari per staccare i descrittori di file.

Un cron-job probabilmente funzionerebbe bene, se non sono necessarie azioni quasi istantanee.

Sto per mettere in pratica un sistema che ho creato, basato sul demone di coda "beanstalkd". Mando vari demoni da (in questo caso, PHP) chiamate alla pagina web al demone, e uno script PHP li prende dalla coda ed esegue varie attività, come il ridimensionamento delle immagini o il controllo dei database (spesso restituendo informazioni tramite un Memcache basato su negozio).

Per evitare processi a lungo termine, l'ho avvolto in uno script BASH, che, a seconda del valore restituito dallo script (" exit (1); ") riavvierà lo script, per ogni (diciamo ) Vengono eseguite 50 attività. Se si riavvia perché lo pianifico, lo farà immediatamente, qualsiasi altro valore di uscita (il valore predefinito è 0, quindi non lo uso) si fermerebbe qualche secondo prima di essere riavviato.

Eseguendo come cron job con periodicità sensibilmente determinata, uno script PHP può fare il lavoro e la stabilità della produzione è sicuramente realizzabile. È possibile che si desideri limitare il numero di istanze FFMpeg simultanee e assicurarsi di disporre della registrazione completa dell'applicazione e della gestione delle eccezioni. Ho implementato processi di polling in esecuzione ininterrottamente in Java, così come lo script PHP cron ogni dieci minuti, ed entrambi fanno bene il lavoro.

Potresti prendere in considerazione l'idea di creare un mysql trigger che esegue un comando system (es. FFmpeg ) anziché un demone. Se qualche ritardo non è un problema, puoi anche mettere qualcosa in cron che viene eseguito ogni pochi minuti per verificare. Cron sarebbe la mia scelta, se è un'opzione.

Per rispondere alla tua domanda, php è perfettamente funzionante come demone. Non deve essere fatto in C.

Se unisci le risposte di Kent Fredric, tokenmacguy e Domster otterrai qualcosa di utile.

php probabilmente non va bene per lunghi tempi di esecuzione, quindi manteniamo breve ogni ciclo di esecuzione e assicuriamoci che il sistema operativo si occupi della pulizia di tutti i fogli di memoria. Come strumento per avviare il tuo script php cron può essere un buon strumento. E se lo fai in questo modo, non c'è molta differenza tra le lingue.

Tuttavia, la domanda è ancora valida. Php è anche in grado di funzionare come un demone normale per lunghi periodi (alcuni anni)? O fogli di memoria assortiti divoreranno tutto il tuo ariete e uccideranno il sistema?

/ Johan

In tal caso, prestare attenzione alle perdite di memoria. PHP 5.2 ha alcuni problemi con il suo garbage collector, secondo this (risolto in 5.3). Forse è meglio usare cron, quindi lo script inizia pulito a ogni esecuzione.

Per quello che hai descritto, andrei con un demone. Assicurati di inserire una sospensione nel ciclo di polling, in modo da non bombardare il database quando non ci sono nuove attività. Un cronjob funziona meglio per il flusso di lavoro / il tipo di report di lavori, dove non c'è alcun evento particolare che inneschi la prossima esecuzione.

Come accennato, PHP ha alcuni problemi con la gestione della memoria. Devi essere sicuro di testare il tuo codice per perdite di memoria, poiché queste si accumulerebbero nel tempo, in uno script di lunga durata. PHP non ha una vera raccolta dei rifiuti - Si basa sul conteggio dei riferimenti, il che significa che i riferimenti ciclici causeranno perdite. Se sei a conoscenza di ciò, puoi codificarlo.

Se hai deciso di seguire la via del demone, c'è un ottimo modulo PEAR chiamato System_Daemon che ho usato di recente su un'installazione PHP v5.3.0 . È documentato sul blog degli autori: http://kevin.vanzonneveld.net/techblog/article / create_daemons_in_php

Se hai installato PEAR, puoi installare questo modulo usando:

pear install -f System_Daemon

Dovrai anche creare uno script di inizializzazione: /etc/init.d/<your_daemon_name>

Quindi puoi:

  • Avvia Daemon: /etc/init.d/projNotifMailDaemon start
  • Stop Demone: /etc/init.d/projNotifMailDaemon stop

I log sono conservati su: /var/log/<your_daemon_name>.log

Non lo consiglierei. PHP non è progettato per l'esecuzione a lungo termine. È progettato principalmente con pagine di breve durata.

Nella mia esperienza PHP può avere problemi con la perdita di memoria per alcune delle attività più grandi.

Un lavoro cron e un po 'di script bash dovrebbero essere tutto ciò di cui hai bisogno dai suoni di esso. Puoi fare cose come:

$file=`mysqlquery -h server < "select file from table;"`
ffmpeg $file -fps 50 output.a etc.

quindi bash sarebbe più facile scrivere, trasferire e mantenere IMHO piuttosto che usare PHP.

Se sai cosa stai facendo di sicuro. Devi capire bene il tuo sistema operativo. PHP generalmente non è adatto per la maggior parte dei demoni perché non è thread e non ha un sistema decente basato su eventi per tutte le attività. Tuttavia, se soddisfa le tue esigenze, allora nessun problema. Il moderno PHP (5.3+) è davvero stabile e non ha perdite di memoria. Fintanto che abiliti il ??GC e non implementi le tue perdite di memoria, ecc., Starai bene.

Ecco le statistiche per un demone che sto correndo: uptime 17 giorni (ultimo riavvio dovuto all'aggiornamento di PHP). byte scritti: 200 GB connessioni: centinaia connessioni gestite, centinaia di migliaia articoli / richieste elaborati: milioni

node.js è generalmente più adatto anche se presenta alcuni fastidi minori. Sono stati fatti alcuni tentativi di migliorare PHP nelle stesse aree, ma non sono poi così fantastici.

Cron job? Sì.

Daemon che funziona per sempre? No.

PHP non ha un garbage collector (o almeno, l'ultima volta che ho controllato non lo era). Pertanto, se si crea un riferimento circolare, non viene MAI ripulito, almeno fino al termine dell'esecuzione dello script principale. Nel processo daemon questo non è approssimativamente mai.

Se hanno aggiunto un GC in nuove versioni, allora sì, puoi.

Provaci. Ho dovuto farlo anche una volta. Come altri hanno detto, non è l'ideale, ma ci riuscirà. Usando Windows, giusto? Buona.

Se ne hai bisogno solo per l'esecuzione di tanto in tanto (una volta all'ora, ecc.). Crea un nuovo collegamento al tuo firefox, posizionalo in un punto rilevante. Apri le proprietà del collegamento, modifica " Target " a:

"C:\Program Files\Mozilla Firefox\firefox.exe" http://localhost/path/to/script.php

Vai al Pannello di controllo > Attività pianificate Punta la tua nuova attività pianificata sul collegamento.

Se ne hai bisogno per l'esecuzione costante o pseudo-costante, dovrai rendere un po 'più piccante lo script.

Inizia il tuo script con

set_time_limit(0);
ob_implicit_flush(true);

Se lo script utilizza un ciclo (come mentre ) è necessario cancellare il buffer:

$i=0;
while($i<sizeof($my_array)){
     //do stuff
     flush();           
     ob_clean();
     sleep(17);
     $i++;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top