2009-03-14 13 views
22

Desidero creare un processo in background e mi è stato detto che di solito sono scritti in C o qualcosa del genere. Ho scoperto di recente che PHP può essere usato per creare un demone e speravo di ottenere qualche consiglio se dovessi fare uso di PHP in questo modo.È saggio usare PHP per un demone?

Ecco i miei requisiti per un demone.

  • controllare continuamente se una riga è stata aggiunti alla tabella del database MySQL i comandi
  • Run FFmpeg su quello che era recuperati dal database di
  • uscita Inserire nella tabella di MySQL

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

Fa anche una grande differenza di prestazioni?

Si prega di consentire per la mia ignoranza, sto imparando! :)

Grazie a tutti

+0

Ci sono un sacco di lingue "tra" PHP e C! Se PHP non funziona (ed è un linguaggio volgare per tale compito) potresti trovare Python o qualsiasi altra cosa che è generalmente considerata "affidabile" più veloce di C. –

risposta

28

Come altri hanno notato, varie versioni di PHP hanno problemi con i loro garbage collector. Ovviamente, se sai che la tua versione non presenta tali problemi, elimini quel problema. Il punto è che tu, , non conosci (sicuramente) lo finché non scrivi il demone ed eseguilo attraverso valgrind per vedere se il PHP installato perde o meno su un dato computer. Quindi, su quella mano, potresti scriverlo solo per scoprire che ciò che Zend pensa sia fisso potrebbe ancora essere bacato, o hai a che fare con una versione leggermente più vecchia di PHP o qualche estensione. Icky.

L'altro problema è un segnale piuttosto buggato. Nella mia esperienza, i gestori di segnale non sono sempre inseriti correttamente con PHP, specialmente quando il segnale viene accodato 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, andare avanti e utilizzare PHP. Se sembra che diventerà piuttosto complesso, o allocerà molta memoria, potresti prendere in considerazione la possibilità di scriverlo in C dopo averlo prototipato in PHP.

Sono una persona C piuttosto magra. Tuttavia, non vedo nulla di sbagliato nell'usare qualcosa di veloce usando PHP (oltre ai casi che ho spiegato). Inoltre, non vedo nulla di sbagliato nell'usare PHP per prototipare qualcosa che può essere o meno riscritto in seguito in C. Ad esempio, la gestione dei database sarà molto più semplice se si utilizza PHP, rispetto alla gestione dei callback utilizzando altre interfacce in C. Quindi in quell'istanza, per un "one off", lo farai sicuramente molto più velocemente.

0

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

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

+1

La garbage collection di PHP è eccellente fintanto che pianifichi adeguatamente il tuo scope. – Nolte

+0

bene, a parte le strutture di array autoreferenziali, dove perde memoria e invia messaggi alla console. woops. –

17

Sarei propenso a eseguire questa attività con un processo cron piuttosto che eseguire il polling del database in un demone.

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

+0

Buona linea di pensiero. Ma da quello che ho capito, il demone continuerà a creare processi figli per tutto ciò che è stato aggiunto al db. Pertanto, FFmpeg può impiegare tutto il tempo che vuole e questo non importa, giusto? – Abs

+0

Si può verificare usando launchd (next gen cron) –

+2

Dipende dal livello di attività. Avviare un processo è molto più pesante che eseguire un timer in un singolo processo, inoltre è necessario aggiungere la logica per gestire più lavori se è troppo frequente.Il lavoro cron avrà bisogno di duplicare la logica di polling in ogni caso. – dkretz

7

Php non è migliore o peggiore per questo tipo di cose rispetto a qualsiasi altro linguaggio di scripting comune. Ha un accesso abbastanza completo a tutte le chiamate di sistema e alle utility di libreria necessarie per questo tipo di lavoro. Se sei più a tuo agio con PHP per lo scripting, allora php farà il lavoro per te.

L'unico lato negativo è che php non è altrettanto onnipresente come, ad esempio, 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, ma se la tua più grande preoccupazione è portare il tuo programma su molti sistemi, potrebbe essere un piccolo ostacolo.

+0

La maggior parte delle distro include PHP tanto quanto perl e python –

+2

Sì, ma non così spesso installato per impostazione predefinita. – SingleNegationElimination

1

Si consiglia di prendere in considerazione la creazione di un mysql trigger che esegue un comando system (ad esempio FFmpeg) anziché un daemon. Se qualche lag non è un problema, puoi anche inserire 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 funziona perfettamente come un demone. Non è necessario farlo in C.

+0

Ah, non sapevo di trigger mysql. Sì, anche il cron job è un'opzione, così i trigger di mysql ora. :) – Abs

+0

Cattiva idea in generale: i trigger sarebbero sincroni, aggiungendo i blocchi per la durata di una transazione; rendono le transazioni più lunghe (ovviamente); e sono più difficili da testare e eseguire il debug. – dkretz

+0

Sono d'accordo sul trigger, stavo solo menzionandolo come alternativa a un demone. In realtà non sarebbe poi così male se dovesse generare un nuovo processo ed uscire. La mia preferenza sarebbe probabilmente ancora usando cron. – gpojd

1

Se si combinano le risposte di Kent Fredric, tokenmacguy e Domster si ottiene qualcosa di utile.

php probabilmente non va bene per i tempi di esecuzione lunghi, , quindi facciamo in modo che ogni ciclo di esecuzione sia breve e assicuratevi che il sistema operativo si occupi della pulizia di qualsiasi perdita di memoria. Come strumento per avviare lo script php, cron può essere un buon strumento. E se lo fai così, non c'è molta differenza tra le lingue.

Tuttavia, la domanda rimane valida. php è anche in grado di funzionare come un demone normale per lunghi periodi (alcuni anni)? Oppure i vari memoryleaks divoreranno tutta la tua ram e uccideranno il sistema?

/Johan

0

Un lavoro cron e un po 'di scripting bash dovrebbe essere tutto il necessario 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, eseguire e mantenere IMHO piuttosto che usare PHP.

6

Sarò contrario e 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 interrogazione sul database. Non c'è davvero penalità fintanto che non si sta eseguendo in modo ingenuo una query.

Se si tratta di qualcosa che non viene eseguito di frequente, si potrebbe in alternativa, eseguire il php da cron, lasciando te o codice di drenare la coda e poi morire.

Ma non abbiate paura di attaccare con ciò che si conosce meglio, in prima approssimazione.

Cerca di non utilizzare i trigger. Impongono un accoppiamento non necessario e non sono divertenti da testare e eseguire il debug.

1

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 ogni volta.

-2

Cron job? Sì.

Daemon che scorre per sempre? No.

PHP non ha spazzino (o almeno, ultima volta controllato che non ha). Pertanto, se si crea un riferimento circolare, NON viene MAI pulito, almeno non fino al termine dell'esecuzione dello script principale. Nel processo daemon questo è approssimativamente mai.

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

2

esecuzione come un processo di cron con periodicità sensibilmente determinato, uno script PHP può fare il lavoro, e la stabilità della produzione è certamente realizzabile. È possibile limitare il numero di istanze FFMpeg simultanee e accertarsi di disporre della registrazione completa dell'applicazione e della gestione delle eccezioni. Ho implementato continuamente i processi di polling in Java, così come lo script PHP cron'd ogni dieci minuti, ed entrambi fanno bene il lavoro.

+0

Ciao Karim, grazie per questa risposta. :) – Abs

1

Per quello che hai descritto, vorrei andare con un demone. Assicurati di inserire una pausa nel ciclo del sondaggio, in modo da non bombardare il database quando non ci sono nuove attività. Un cronjob funziona meglio per il tipo di flusso di lavoro/rapporto di lavori, in cui non vi è alcun evento particolare che attiva 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, dal momento che queste si sarebbero accumulate nel tempo, in uno script di lunga durata. PHP non ha una vera garbage collection: si basa sul conteggio dei riferimenti, il che significa che i riferimenti ciclici causeranno perdite. Se sei a conoscenza di ciò, puoi codificarlo.

3

Un lavoro cron funzionerebbe probabilmente bene, se non sono richieste azioni quasi istantanee.

Sto per mettere in funzione, un sistema che ho creato, basato sul daemon 'beanstalkd'. Invio vari messaggi di piccole dimensioni da (in questo caso, PHP) chiamate di pagine Web al daemon, e uno script PHP li preleva dalla coda ed esegue varie attività, come il ridimensionamento di immagini o il controllo di database (spesso passando informazioni indietro tramite Memcache negozio basato su).

Per evitare processi a esecuzione prolungata, l'ho avvolto in uno script BASH, che, in base al valore restituito dallo script ("exit (1);") riavvierà lo script, per ogni (diciamo) 50 compiti è eseguito. Se si sta riavviando perché lo pianifico, lo farà all'istante, qualsiasi altro valore di uscita (il valore predefinito è 0, quindi non lo uso) si fermerebbe alcuni secondi prima del riavvio.

+0

Grazie per il tuo esempio. – Abs

-4

Vai per questo. Dovevo farlo anche una volta. Come altri hanno detto, non è l'ideale, ma sarà pronto. Usando Windows, giusto? Buona.

Se necessario, è necessario eseguire occasionalmente (una volta all'ora, ecc.). Crea una nuova scorciatoia per il tuo firefox, posizionala in un punto pertinente. Aprire le proprietà per il collegamento, il cambiamento "Target" a:

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

Vai a Pannello di controllo> Operazioni pianificate Point tua nuova attività pianificata presso la scorciatoia.

Se è necessario eseguire costantemente o pseudo-costantemente, è necessario aumentare leggermente lo script.

Inizia lo script con

set_time_limit(0); 
ob_implicit_flush(true); 

Se lo script utilizza un ciclo (come mentre) si deve cancellare il buffer:

$i=0; 
while($i<sizeof($my_array)){ 
    //do stuff 
    flush();   
    ob_clean(); 
    sleep(17); 
    $i++; 
} 
+2

Man questo approccio è talmente sbagliato ... – loostro

3

Un problema con correttamente daemonizing uno script PHP è che PHP non ha interfacce per i syscalls dup() o dup2(), che sono necessari per scollegare i descrittori di file.

1

Se deciso di imboccare la strada daemon, v'è un grande modulo PEAR chiamato System_Daemon che recentemente ho usato con successo su un'installazione di PHP v5.3.0. È documentato sul autori blog: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php

Se avete PEAR installato, è possibile installare questo modulo utilizzando:

pear install -f System_Daemon 

Sarà inoltre necessario creare uno script di inizializzazione: /etc/init.d/<your_daemon_name>

Poi si può:

  • Inizio Daemon: /etc/init.d/projNotifMailDaemon start
  • Sto p Daemon: /etc/init.d/projNotifMailDaemon stop

I registri sono tenuti a: /var/log/<your_daemon_name>.log

+0

V. utile. Grazie per il link e per l'introduzione e l'interruzione degli script. – Joe

0

Se si sa cosa si sta facendo sicuro. Devi capire bene il tuo sistema operativo. Generalmente PHP non è adatto alla maggior parte dei daemon perché non è thread e non ha un sistema basato su eventi decente per tutte le attività. Tuttavia, se si adatta alle tue esigenze, allora nessun problema. Modern PHP (5.3+) è veramente stabile e non ha perdite di memoria. Finché abiliti il ​​GC e non implementi le tue perdite di memoria, ecc. Starai bene.

Ecco le statistiche per un demone che sto utilizzando: tempo di attività 17 giorni (ultimo riavvio a causa dell'aggiornamento di PHP). byte scritti: 200GB connessioni: centinaia connessioni manipolati, centinaia di migliaia articoli/richieste elaborate: milioni

node.js è generalmente più adatto, anche se ha alcuni un po 'noiose. Alcuni tentativi di migliorare PHP nelle stesse aree sono stati fatti ma non sono poi così grandi.

Problemi correlati