2012-12-10 4 views
7

Attualmente sto provando a generare un epub su Demenad dal contenuto che è disponibile per me. Sfortunatamente, quando c'è un sacco di contenuti per l'epub, ci vuole un po '(10 minuti in alcuni casi) per completare la richiesta http - che non è l'idealePHP - Long Running Background Task

Voglio seguire un approccio simile a quello di Safari - generare un epub ed e-mail che l'utente quando il documento è disponibile

la mia domanda è - qual è il modo migliore per l'esecuzione di uno sfondo compito/thread in PHP che potrebbe richiedere molto tempo per completare

+1

Nota che se sei su un host web condiviso, il tuo host potrebbe non consentire l'esecuzione di script per lunghi periodi di tempo. Di conseguenza, potrebbe essere necessario ridurre il lavoro (se possibile). –

risposta

16

Si vuole stare attenti con i processi PHP di lunga durata in quanto, per un PHP non è molto efficiente in termini di memoria (ad esempio un array di soli 100 in PHP può consumare fino a 15 KB di memoria). Questo è normale per il 99% dei casi d'uso, dal momento che la maggior parte delle persone usa solo PHP per i siti Web e questi processi vengono eseguiti per frazioni di secondo, quindi la memoria viene sacrificata per la velocità. Tuttavia, per un lungo processo (specialmente se ne hai molti) questa potrebbe non essere la soluzione migliore.

Si desidera anche fare molta attenzione a chiamare exec/shell_exec come le funzioni in PHP poiché vengono implementate internamente come flussi (ad esempio possono causare il blocco nel processo padre in quanto normalmente deve attendere il flusso per restituire i dati).

Un'opzione per lo sfondo dell'attività è di utilizzare fork. Tuttavia, suggerisco caldamente di utilizzare un job manager adeguato come gearman (vedere anche php extensions), o la coda, come amqp o zmq, per gestire queste attività in modo più pulito. Quale è più adatto al tuo caso d'uso, ti lascerò decidere.

1

è possibile eseguire il comando

$command = 'nohup >/dev/null 2>&1 /your/background/script.php &'