Ход выполнения вызова AjaX отображает только начальное и конечное значение

Мне нужно выполнить вызов AjaX для PHP-скрипта с длительным временем выполнения. Моя цель — показать статус выполнения этого выполнения.

Идея состоит в том, чтобы создать вызов AjaX, чтобы периодически запрашивать у сервера статус выполнения. Состояние прогресса сохраняется в $_SESSION['progress']изначально установлен на 0 и изменился из сценария во время выполнения.

Вот мой код на стороне клиента и сервера.

Сторона клиента

// invoke the script (ie. with button)
$('#start').click(function()
{
$.ajax
({
url: "long-script.php"});
});

// check progress periodically
setInterval(progress, 100);
function progress()
{
$.ajax
({
dataType: "json",
url: "progress.php",

success: function(data)
{
console.log(data);
}
});
}

давно script.php

// just an example to emulate execution
sleep(1);
$_SESSION['progress']=30;
sleep(1);
$_SESSION['progress']=70;
sleep(1);
$_SESSION['progress']=100;

progress.php

header('Content-Type: application/json');
echo json_encode($_SESSION['progress']);

Проблема в том, что console.log() в выходных данных функции выполнения 0 перед выполнением сценария останавливает вывод данных во время выполнения и, наконец, выводит 100 когда скрипт завершен. Что мне не хватает?

0

Решение

Проблема в том, что сеанс не записывается до тех пор, пока сценарий не завершится или сеанс не закроется.

Вы должны помнить, что сеансы по умолчанию в php хранятся как файлы в системе и блокируются во время выполнения.

Что вы можете сделать, это изменить long-script.php подать немного.

session_start();

sleep(1);
$_SESSION['progress']=30;
session_write_close();

sleep(1);
session_start();
$_SESSION['progress']=70;
session_write_close();

sleep(1);
session_start();
$_SESSION['progress']=100;
session_write_close();

Идея состоит в том, чтобы писать в сессию после каждого изменения прогресса.

Затем вам нужно будет начать сеанс снова.

Это может быть неправильным способом сделать это, но вы всегда можете посмотреть функции сессии в php. Взгляните на это session_write_cloe

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]