Brouillon
Proposition de mécanismes pour l'exécution de travaux (Jobs) sur le serveur Apache.
Un job PHP est du code PHP qui est exécuté par Apache même si le client Web est déconnecté : la déconnexion du client Web ne coupe pas le process, qui continue son exécution.
Pour cela, il faut que le job utilise les paramètres suivants afin de pouvoir se « détacher » du client :
ignore_user_abort(true); set_time_limit(0);
L'interaction du Job avec le client ne se fait donc plus via le canal habituel STDOUT (echo/print) mais doit utiliser un mécanisme pour que le client puisse interroger et avoir le statut du job et les messages émis par le job.
La classe Job permet de manipuler les tâches.
La classe Job s'appuie que un objet JobStorage qui permet de gérer le stockage de l'objet Job de manière persistante sur un support donné.
$jobStorage = new JobDirStorage(array('work_dir' => '/var/jobs'));
$job = new Job('foo', $jobStorage);
L'interface JobStorageInterface définis l'interface des objets JobStorage qui vont gérer la sérialisation/dé-sérialisation d'un objet Job.
La méthode add() permet de stocker de manière persistante un objet Job dans l'espace de stockage.
La méthode add() prend en argument un objet Job.
La méthode update() met à jour l'objet dans l'espace de stockage avec la version fournit.
La méthode update() prend en argument un objet Job et stocke celui-ci dans l'espace de stockage.
L'objet qu'on update() doit avoir été inséré au préalable dans l'espace de stockage à l'aide de la méthode add().
La méthode getLog() prend en argument l'identifiant du client ($clientId) et l'identifiant d'une tâche ($jobId) pour retourner la liste des messages de logs de la tâche d'id $jobId sous la forme d'un array()
La méthode appendLog() prend en argument ld'identifiant du client $clientId, l'identifiant de la tâche $jobId et le message $message à ajouter au log de la tâche.
$jobStorage = new JobDirStorage();
$job = new Job('foo', $jobStorage);
$ret = $job->run('my_function', array('arg1', 'arg2'));
$jobStorage = new jobDirStorage();
$job = new Job('foo', $jobStorage);
$jobList = $job->getJobList();
foreach( $jobList as $jobId ) {
$rJob = $job->getJob($jobId);
$jobStatus = $rJob->getStatus();
$logList = $rJob->getLog();
echo sprintft("Job id=%s\n", $jobId);
var_dump($jobStatus);
foreach( $logList as &$line ) {
echo sprintf("| %s\n", $line)
}
}