Est-il possible d'implémenter SSE sur Joomla, de la même manière que cela est implémenté en version pure PHP ici ?
Voici ce que j'ai jusqu'à présent:
administrateur/composants/com_component/controllers/sync.php
class ComponentControllerSync extends JControllerLegacy
public function execute()
{
$close = array(
'id' => 'CLOSE',
'message' => 'stream closed');
$progress = array(
'id' => 'PROGRESS',
'message' => '100/100 done',
'progress' => '100%');
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
echo "data: " . json_encode($progress) . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
sleep(5);
echo "data: " . json_encode($close) . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
JFactory::getApplication()->close();
}
}
JavaScript qui appelle le contrôleur
(function($, window, document){
$(function(){
$('#sync').on('click', function(){
$.eventsource({
label: 'evt',
url: 'index.php?option=com_component&task=sync.execute',
dataType: 'text',
open: function(data) {
console.log('started');
},
message: function(e) {
var json = e;
var id = e.id;
if(id == 'PROGRESS'){
console.log(json.message + json.progress);
}
else if(id == 'CLOSE'){
console.log(json.message);
$.eventsource('close', 'evt');
}
else if(id == 'ERROR'){
console.log(json.message);
$.eventsource('close', 'evt');
}
}
});
});
});
})(window.jQuery, window, document);
Joomla prend tous les échos dans un tampon puis présente la sortie au client, ce qui est le contraire de ce que je voulais. Existe-t-il un moyen de contourner ce tampon et de diffuser les échos?
Par défaut, Joomla exécute un contrôleur et affiche une page de la manière définie pour optimiser la mise en mémoire tampon dans une seule sortie. Votre routine fonctionne différemment, en contrôlant la sortie et le canal du navigateur.
Outre le problème de mise en mémoire tampon, le problème principal de la longue durée PHP scripts est le délai de session du serveur Web (max_execution_time). Même s'il renvoie des sorties périodiques au navigateur avec la technique détaillée, la session peut être tué si la page se termine avant max_execution_time.
Si vous ne pouvez pas définir max_execution_time ou, pour des raisons de performances, max_execution_time doit être court, il est préférable de décomposer la tâche en rappels asynchrones et de conserver l'heure d'exécution dans le même ordre qu'une page commune.