it-swarm.com.de

Joomla 3.x und SSE

Ist es möglich, SSE in Joomla zu implementieren, so wie es in pure PHP hier implementiert ist?

Folgendes habe ich bisher:

administrator/components/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, das den Controller aufruft

(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 nimmt alle Echos in einen Puffer und präsentiert die Ausgabe dem Client, was das Gegenteil von dem ist, was ich wollte. Gibt es eine Möglichkeit, diesen Puffer zu umgehen und die Echos zu streamen?

2
ehz350

Standardmäßig führt Joomla einen Controller aus und rendert eine Seite so, dass die Pufferung in einer einzelnen Ausgabe optimiert wird. Ihre Routine funktioniert anders, da Sie die Kontrolle über Ausgabe und Browserkanal haben.

Neben dem Pufferungsproblem ist das Hauptproblem bei lang laufenden PHP Skripten das Zeitlimit für Webserver-Sitzungen (max_execution_time). Auch wenn mit der detaillierten Technik periodische Ausgaben an den Browser zurückgegeben werden, kann dies die Sitzung sein getötet, wenn die Seite vor max_execution_time fertig ist.

Wenn Sie keine max_execution_time definieren können oder aus Leistungsgründen die max_execution_time kurz sein muss, ist es besser, die Task in asynchronen Rückrufen zu unterbrechen und die Ausführungszeit in derselben Reihenfolge wie auf einer gemeinsamen Seite zu halten.

1
Anibal