Exécuter une action en fond de tâche en php

Fork sous Linux en image

Fork sous Linux en image
En PHP pour ne pas bloquer le processus courant il est possible d’effectuer une action en parallèle soit via un exec ou en utilisant la fonction pcntl_fork.

Exec

L’avantage d’un exec c’est qu’il peut être exécuter aussi bien sur une plateforme Windows que Linux. Il peut être également appelé en mode apache et CLI.

exec('php /var/www/mon_script.php' > /dev/null 2>&1');

Pcntl_fork

Cette fonction n’est disponible qu’en mode CLI sur un serveur Linux. Le code est un peu plus long, puisqu’il contient un fallback dans le cas ou cette fonction n’est pas disponible.
Cette fonction est néanmoins plus rapide à être exécuter, il faut tout de même faire attention si vous utilisez Zend OpCache, qui a tendance à s’emmêler les pinceaux.

J’ai rajouté un TODO close Mysql connection, then create a new one, sans ça j’avais des soucis de connexion SQL. Le fil fraichement créé récupère la connexion SQL du père ce qui engendrait des soucis.

function is_forkable() {
  return !(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') && function_exists('pcntl_fork');
}

function fork () {
  if (is_forkable()) {
    $pid = pcntl_fork();
    if ($pid === -1) {
      throw new Exception('Unable to fork');
    } elseif ($pid) { // father process
      // TODO close Mysql connection, then create a new one
    } else { // child
      /*
	   * TODO Your code here
	   *
	  /*
    }
  } else {
    exec('...');
  }
}

 

Mise en pratique
Exec peut être utilisé pour effectuer des traitements sur des images via ffmpeg ou lancer des indexages avec Sphinx Search.
pcntl_fork quant à lui est souvent utilisé pour le traitement des Queues comme l’envoi de mail.