2010-09-01 13 views
5

Ho alcuni script che devono essere eseguiti contemporaneamente come processi separati. Il mio piano è di avere un cron job che esegua più istanze di questi script a intervalli prestabiliti. E 'questa una buona idea? Quali sono i pro/contro per questo approccio? Ci sono altre opzioni che devo prendere in considerazione?PHP Concurrency via Cron

Bottomline: Sto provando a simulare il multithreading. Qualsiasi condizione di gara verrà gestita tramite codice (ad esempio, impostazione degli stati in DB, ecc.). Si suppone che gli script svolgano compiti intensivi di elaborazione (ad esempio creando miniature, ecc.).

risposta

5

È possibile utilizzare il biforcarsi. Lo script di avvio caricherà tutte le configurazioni e le inizializzazioni predefinite, quindi imposterà i processi figlio per l'elaborazione. Potrebbe quindi monitorare i processi per vedere se sono ancora in esecuzione. http://php.net/manual/en/function.pcntl-fork.php

0

Non PHP ha fork()? Anche se non è realmente multithreading, è un modo basilare di co-routine.

2

Bene, se ne hai bisogno come cronjob, vai avanti. Se si desiderano più processi, è molto probabile che si desideri utilizzare pcntl_fork per creare più istanze dello stesso script.

1

A seconda della velocità con cui si desidera reagire a tali lavori e se si desidera eseguire attività che richiedono un uso intensivo del processore, è possibile distribuire tale elaborazione utilizzando un sistema di accodamento. Controlla Gearman o beanstalkd con più worker per computer se disponi di più core/processori.

0

Uno dei vantaggi di cron è che eseguirà una copia dello script all'intervallo impostato indipendentemente dal numero di processi di script già in esecuzione. Ciò significa che gli script hanno bisogno di un modo per comunicare tra loro in modo che un massimo di N script vengano eseguiti contemporaneamente (gli script in eccesso possono uscire immediatamente).

Un'alternativa a cron potrebbe essere supervisord che eseguirà un numero configurabile di script e li monitorerà in modo tale che qualsiasi uscita venga rigenerata.