it-swarm.dev

Joomla 3.xe SSE

È possibile implementare SSE su Joomla, come è implementato in pure PHP qui ?

Ecco quello che ho finora:

administrator/components/com_component/controller/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 che chiama il controller

(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 prende tutti gli echi in un buffer, quindi presenta l'output al client, che è l'opposto di quello che volevo. C'è un modo per aggirare questo buffer e trasmettere l'eco?

2
ehz350

Per impostazione predefinita, Joomla esegue un controller e esegue il rendering di una pagina in modo definito per ottimizzare il buffering in un singolo output. La tua routine funziona in modo diverso, avendo il controllo sull'output e sul canale del browser.

Oltre al problema del buffering, il problema principale con long-running PHP è il timeout della sessione del server web (max_execution_time). Anche se restituisce output periodici al browser con la tecnica dettagliata, la sessione può essere ucciso se la pagina viene completata prima di max_execution_time.

Se non è possibile definire un max_execution_time o, per motivi di prestazioni, max_execution_time deve essere breve, è meglio interrompere l'attività in callback asincronici e mantenere il tempo di esecuzione nello stesso ordine di una pagina comune.

1
Anibal