Daemons in PHP

Daemons in PHP

Wij gebruiken PHP niet alleen voor webrequests maar wij hebben ook daemons draaien die voor ons bepaalde taken uitvoeren. Je moet hier bijvoorbeeld denken aan een server die achtergrondtaken start, maar deze keer wil ik graag vertellen over onze gearman-manager daemon.

Onze gearman-manager is een daemon die gearman worker processen start op basis van de behoefte die we zien in de gearman queue. Sommige taken worden heel weinig gebruikt en in ons geval zou dat betekenen dat we zomaar voor één taak 2000 processen (voor elke klantomgeving één) zouden moeten hebben idlen. Als het kan maken we de workers taakspecifiek in plaats van klantspecifiek, maar in ons geval is dat vaak niet mogelijk. We starten dus gearman workers, laten die een tijd leven en als ze te lang idle zijn worden ze weer gestopt. Als er teveel jobs voor een specifieke worker zijn en de queue oploopt kan de gearman-manager ook meerdere workers starten van hetzelfde type.

Er wordt vaak gezegd dat PHP niet erg geschikt is voor langlevende processen, maar uit persoonlijke ervaringen kan ik melden dat dit echt onzin is. PHP is hiervoor een prima oplossing, zeker als het past in de rest van het ecosysteem. In alle gevallen dat wij het gebruiken, hebben we een moederproces dat niet veel doet behalve kinderen fork()en die het echte werk doen.

In het moederproces moet je erg oppassen met objectvariabelen en referenties, en begrijpen wat garbage collection doet. Bijvoorbeeld een memory-leak door objecten te maken in een lusje. Pas bij het verlaten van een functie worden ze opgeruimd. Dat kan er toe leiden dat je proces over langere tijd veel geheugen gebruikt. Een proces dat veel geheugen gebruikt en weinig CPU is een waarschijnlijke kandidaat om gekilled te worden door de linux kernel in een out-of-memory situatie.

Voor kindprocessen is dat een stuk minder belangrijk. Die hebben bij ons meestal een maximale leeftijd van een paar uur. Als een kindproces een keer crasht neemt een andere de taak wel over.

Wat zijn jouw ervaringen met daemons in PHP? Heb jij net als ik positieve ervaringen, of zou je het juist nooit zo doen?

Leave a comment...

Leave a comment

Italic en bold

*Dit is italic*, en _dit ook_.
**Dit is bold**, en __dit ook__.

Links

Dit is een link naar [Procurios](http://www.procurios.nl).

Lijsten

Een lijst met bullets kan worden gemaakt met:
- Min-tekens,
+ Plus-tekens,
* Of een asterisk.

Een genummerde lijst kan worden gemaakt met:
1. Lijst-item nummer 1.
2. Lijst-item nummer 2.

Quote

Onderstaande tekst vormt een quote:
> Dit is de eerste regel.
> Dit is de tweede regel.

Code

Er kan een blok met code worden geplaatst. Door voor de tekst vier spaties te plaatsen, ontstaat een code-block.