Индикатор выполнения скрипта, использующего серверные отправленные события(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, и все, что угодно, поможет, спасибо