Мне нужно выполнить вызов 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
когда скрипт завершен. Что мне не хватает?
Проблема в том, что сеанс не записывается до тех пор, пока сценарий не завершится или сеанс не закроется.
Вы должны помнить, что сеансы по умолчанию в 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
Других решений пока нет …