Kiki's PCNTL Daemon

Het Kiki framework kan niet alleen webpagina's genereren, maar ook achtergrondtaken uitvoeren via een heuse daemon.

Kiki logo

Achtergrondtaken...

Websites en webpagina's dienen razendsnel te zijn. Gebruikers haken af wanneer het laden van een pagina te lang duurt.

Maar soms zijn er stukken dataverwerking nodig die nu eenmaal tijd nodig hebben, omdat er veel gerekend dient te worden of wellicht een externe API aangesproken moet worden. Vaak worden dit soort taken met een cronjob uitgevoerd, maar nadelen hiervan zijn dat ze dan slechts één keer per minuut gedraaid kunnen worden en bij piekbelasting goed moet worden opgelet dat een vorige draai van het script al is afgerond alvorens een nieuwe te starten.

...achtergrondproces!

Als oplossing heeft Kiki de mogelijkheid om continu een achtergrondproces te draaien, een zogenaamde daemon. Hoewel gewoon een stukje PHP gedraagt deze zich als ieder ander systeemproces: geen input of output op de console, een nette detach naar de achtergrond en via de PCNTL standaard voor process control kunnen zelfs meerdere children worden geforkt.

Hiermee worden achtergrondprocessen praktisch direct uitgevoerd zonder wachttijden of opeenstapeling van processen (indien er geen taken gevonden zijn wacht de daemon één á twee seconden, na het afronden van een taak kijkt deze direct verder).

Wat een gebruiker in de daemon uitvoert kan deze uiteraard helemaal zelf bepalen, door de abstract main() methode te implementeren in een eigen Daemon class die Kiki\Daemon uitbreidt.

De daemon aanroepen is vervolgens een fluitje van een cent:

#!/usr/bin/php
<?php
  namespace MyNamespace;

  require_once "/var/www/kiki/lib/init.php";

  $myDaemon = new Daemon();
  $myDaemon->start(1);

Benieuwd naar de code?

Queue Daemon / Object Queue

Voor het gemak en de meest voorkomende situaties heeft Kiki al een eigen QueueDaemon implementatie die eenvoudig te gebruiken is. Via de ObjectQueue class kunnen er voor alle classes die overerven van BaseObject taken in de database worden opgeslagen. De combinatie hiervan geeft de volgende mogelijkheden:

Om hier gebruik van te maken gebruik je deze code:

<?php
  namespace MyNamespace;
  use Kiki\ObjectQueue;

  class Daemon extends \Kiki\QueueDaemon
  {
    // Handler voor de database actie 'do_mystuff'
    protected function do_mystuffAction( $o )
    {
      // Do stuff

      if ( $manualDelay )
      {
        $queueTime = date( 'Y-m-d H:i:s', $whenever );
        ObjectQueue::delay( $o->id, $queueTime );
        return null;
      }

      if ( $success )
        return true;

      if ( $failure )
        return false;
    }
  }	

Bekijk de code voor details en inspiratie:

Dit was mijn spreekbeurt over Kiki's PCNTL daemon.