Member 14831385 Ответов: 0

Индикатор выполнения скрипта, использующего серверные отправленные события(SSE) в PHP


Я пытаюсь показать прогресс выполнения скрипта python на PHP с помощью индикатора выполнения. Я нашел ссылку (https://www.htmlgoodies.com/beyond/php/show-progress-report-for-long-running-php-scripts.html[^]), который использует SSE для отправки обновлений прогресса клиенту. В исходном коде цикл используется для имитации длинного скрипта, но в моем случае я пытаюсь выполнить скрипт python, который занимает примерно 50 секунд.

index.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>
    <script type="text/javascript">
    var es;

    function startTask() {
        es = new EventSource('process.php');

        //a message is received
        es.addEventListener('message', function(e) {
              var result = JSON.parse( e.data );

              addLog(result.message);

              if(e.lastEventId == 'CLOSE') {
                  addLog('Received CLOSE closing');
                  es.close();
                  var pBar = document.getElementById('progressor');
                  pBar.value = pBar.max; //max out the progress bar
              }
              else {
                  var pBar = document.getElementById('progressor');
                  pBar.value = result.progress;
                  var perc = document.getElementById('percentage');
                  perc.innerHTML   = result.progress  + "%";
                  perc.style.width = (Math.floor(pBar.clientWidth * (result.progress/100)) + 15) + 'px';
              }
        });

        es.addEventListener('error', function(e) {
            addLog('Error occurred');
            es.close();
          });
      }

        function stopTask() {
          es.close();
          addLog('Interrupted');
       }

        function addLog(message) {
          var r = document.getElementById('results');
          r.innerHTML += message + '<br>';
          r.scrollTop = r.scrollHeight;
      }
    </script>
    <body>
        <br />
        <input type="button" onclick="startTask();"  value="Start Long Task" />
        <input type="button" onclick="stopTask();"  value="Stop Task" />
        <br />
        <br />

        <p>Results</p>
        <br />
        <div id="results" style="border:1px solid #000; padding:10px; width:300px; height:250px; overflow:auto; background:#eee;"></div>
        <br />

        <progress id='progressor' value="0" max='100' style=""></progress>
        <span id="percentage" style="text-align:right; display:block; margin-top:5px;">0</span>


    </body>
</html>

process.php
<?php
header('Content-Type: text/event-stream');
// recommended to prevent caching of event data.
header('Cache-Control: no-cache');

function send_message($id, $message, $progress) {
    $d = array('message' => $message , 'progress' => $progress);

    echo "id: $id" . PHP_EOL;
    echo "data: " . json_encode($d) . PHP_EOL;
    echo PHP_EOL;

    ob_flush();
    flush();
}


//LONG RUNNING TASK
// for($i = 1; $i <= 10; $i++) {
//     send_message($i, 'on iteration ' . $i . ' of 10' , $i*10);
//     sleep(1);
$path="test.py";
$test= shell_exec("python " . $path . ""); {
    echo "data: " . json_encode($test) . "\n\n";
    sleep(1)
}

send_message('CLOSE', 'Process complete');

Проблема: Как вы можете видеть в process.php Я прокомментировал исходный код и поместил простое выполнение python в php. Я просто хочу отобразить ход выполнения сценария, но он этого не делает. Что я должен сделать, чтобы показать ход выполнения сценария? Примечание: Я не думаю, что это имеет отношение к делу, но скрипт python просто открывает пакетный файл.

Что я уже пробовал:

Я искал решения, чтобы показать прогресс выполнения скрипта на php, но большинство примеров касаются загрузки/скачивания файлов, а не выполнения скрипта. Есть примеры, подобные тому, который используется ссылкой, использующей SSE, но все они используют цикл. Я пытаюсь показать прогресс скрипта python, но он не работает. Я новичок в php, и все, что угодно, поможет, спасибо

0 Ответов