> Thread
fr

Qu'est-ce qu'un thread

Les habitués du développement en C/C++ et surtout sous Unix connaissent certainement les méthodes "fork" ou les "threads". L'intérêt de ces concepts est de permettre à un programme de faire fonctionner plusieurs tâche en même temps.

PHP en mode console peut utiliser pcntl mais dés lors que nous utilisons PHP sur Apache (en tant que module), nous n'avons droit qu'à un seul processus par appel.

De ce fait, si nous avons une tâche A qui prend 2 secondes, et une tâche B qui prend 1 secondes, notre programme prendra 3 secondes. C'est fort dommage... car si les deux tâches tournaient en même temps, on pourrait avoir une processus de seulement de 2 secondes en tout. C'est à dire, le temps le plus long de nos processus.

Copix permet de créer des processus multiplexés via le module "Thread".

ThreadManager

Afin d'exécuter plusieurs tâche en même temps, nous allons avoir besoin d'une classe qui va créer un "pool" de processus. Cette classe exécutera alors l'ensemble des threads en parallèle et se mettra en attente le temps que tous les processus soient terminés.

ThreadManager a donc deux méthodes:

  1. add (nom de la classe, objet de paramètres)
  2. execute

add attend en paramètre le nom de la classe qui sera considérée comme un thread. Cette classe devra hériter de la class Thread et avoir une méthode public nommée process.

Voici un exemple:


<?php
// fichier monmodule/classes/thread1.class.php
class Thread1 extends Thread{
    public function process($pParams=null){
        sleep ($pParams->time);
        return "Fin après".$pParams->time ."secondes";
    }
}
?>
 

Ce thread attendra le temps que nous lui indiquons en paramètre, puis retournera un message.

Maintenant, appelons plusieurs fois notre thread:


$manager = _class("thread|threadmanager");


$manager->add("monmodule|thread1",_ppo(array('time'=>2)));
$manager->add("monmodule|thread1",_ppo(array('time'=>3)));
$manager->add("monmodule|thread1",_ppo(array('time'=>1)));

$reponses = $manager->execute();
 

Si nous n'étions pas en mode thread, le temps total serait de 2+3+1= 6 secondes. Or dans notre cas, les processus vont s'exécuter en même temps, soit le temps maximum de 3 secondes.

$responses contient l'ensemble des réponses des threads retornés par les méthodes process, quelque soit le type renvoyé par les méthodes process.

Restricitions

Vous ne pouvez pas utiliser $_SESSION ou CopixSession dans les threads. Cette restrictions est dût au fait que d'une part les processus sont déliés les uns des autres avec des sessions différentes et d'autre part vous risqueriez d'écraser des variables utilisée par les autres threads.

Vous ne devez jamais passer de resources dans les objets. Si vous voulez utiliser une base de données, il faut ouvrir la connexion depuis le thread.

Vous ne devez jamais faire de redirection dans les processus.