it-swarm.dev

Joomla 3.xおよびSSE

純粋にSSE here で実装する方法のように、JoomlaでPHPを実装することは可能ですか?

ここに私がこれまでに持っているものがあります:

管理者/コンポーネント/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

(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はすべてのエコーをバッファーに取り込み、出力をクライアントに提示します。これは、私が望んでいたものとは逆です。このバッファを回避してエコーをストリーミングする方法はありますか?

2
ehz350

デフォルトでは、Joomlaはコントローラーを実行し、定義された方法でページをレンダリングして、単一の出力でのバッファリングを最適化します。ルーチンは異なる方法で機能し、出力とブラウザーチャネルを制御します。

バッファリングの問題に加えて、長時間実行されるPHPスクリプトの主な問題は、Webサーバーのセッションタイムアウト(max_execution_time)です。詳細な手法でブラウザに定期的な出力を返す場合でも、セッションはmax_execution_timeより前にページが完了した場合は強制終了されます。

Max_execution_timeを定義できない場合、またはパフォーマンス上の理由でmax_execution_timeを短くする必要がある場合は、非同期コールバックでタスクを中断し、実行時間を共通のページと同じ順序に保つことをお勧めします。

1
Anibal