Я использую AJAX для передачи значения в качестве параметра функции в классе, выполнение которого занимает немного времени. Я хочу отображать выходные сообщения в браузере при запуске сценария PHP.
Я попытался установить переменную сеанса в нескольких местах сценария и использую AJAX, чтобы попытаться прочитать сеанс переменная каждую секунду.
Вот код
JavaScript
<script>
var outputs = setInterval(displayOutputMessage, 1000);
$.post('ajax.php', {action:'run', id:12345}).then(() => {
clearInterval(outputs);
});
function displayOutputMessage() {
$.post('ajax.php', {action:'getOutputMessages'}).then(data => {
if (data !== 'session not set') {
$('#output').html(data);
}
});
}
</script>
PHP
switch ($_POST['action']) {
case 'run':
$x = new LongScript();
$x->longFunction($_POST['id']);
break;
case 'getOutputMessages':
echo isset($_SESSION['outputMessage']) ? $_SESSION['outputMessage'] : 'session not set';
break;
}
session_start();
class LongScript
{
public function longFunction($id) {
$items = XYZ::getItems($id);
foreach ($items as $k => $item) {
//code omitted
$_SESSION['outputMessage'] = "output message ($k)";
$suppliers = XYZ::getSuppliers($item['oem'])
foreach ($suppliers as $supplier) {
//code omitted
$_SESSION['outputMessage'] = "another message ($k)";
}
}
}
}
Проблема, с которой я столкнулся, заключается в том, что выходные данные отображают данные переменной сеанса только после того, как длинная функция завершила свое выполнение. Выполнение сценария может занять от 45 секунд до 3 минут, а выполнение кода внутри циклов занимает некоторое время, поэтому я ожидаю увидеть некоторые другие выходные сообщения, кроме последнего. Я также попытался использовать flush()
после установки переменной сеанса, и это не имело значения.
Я открыт для использования другого способа сделать то же самое, если использование сеанса для этого не возможный. Сама страница будет доступна только для менее чем 5 пользователей.