Я думаю, что ваша проблема здесь связана с сеансом.
Когда у скрипта открыт сеанс, он блокирует файл сеанса. Это означает, что любые последующие запросы, которые используют тот же идентификатор сеанса, будут поставлены в очередь до тех пор, пока первый скрипт не освободит свою блокировку файла сеанса. Вы можете принудительно сделать это с помощью session_write_close()
- но это вам не очень поможет, поскольку вы пытаетесь поделиться информацией о прогрессе с файлом сеанса, поэтому сценарию post
потребуется сохранить данные сеанса. открыт и доступен для записи.
Вам нужно будет найти другой способ обмена данными между сценариями post
и progress
- если post
открывает данные сеанса в течение его выполнения, progress
никогда не сможет получить доступ к сеансу данные до тех пор, пока post
не завершит выполнение. Возможно, вы могли бы использовать идентификатор сеанса для создания временного файла, к которому post
имеет доступ для записи, в который вы помещаете данные индикатора прогресса. progress
может проверить файл и вернуть эти данные. Существует много вариантов IPC (межпроцессное взаимодействие) - это не очень красивый вариант, но он обладает преимуществом максимальной мобильности.
В качестве примечания - пожалуйста, не передавайте строки в setInterval()
, передайте функции. Таким образом, ваша строка должна выглядеть так:
var progress = setInterval(ask, 500);
Но - было бы лучше использовать setTimeout()
в обработчиках success
/ error
функции ask()
ajax. Это связано с тем, что при использовании setInterval()
новый запрос будет инициирован независимо от состояния предыдущего. Было бы более эффективно подождать, пока предыдущий запрос не закончится, прежде чем инициировать следующий. Так что я бы сделал что-то вроде этого:
<script type="text/javascript">
// We'll set this to true when the initail POST request is complete, so we
// can easily know when to stop polling the server for progress updates
var postComplete = false;
var ask = function() {
var time = new Date().getTime();
$.ajax({
type: 'get',
url: '/url/to/progress' + '?time=' + time,
success: function(data) {
$("#progress").html(data);
if (!postComplete)
setTimeout(ask, 500);
}
},
error: function() {
// We need an error handler as well, to ensure another attempt gets scheduled
if (!postComplete)
setTimeout(ask, 500);
}
}
});
}
$("#test").click(function() {
// Since you only ever call post() once, you don't need a seperate function.
// You can just put all the post() code here.
var time = new Date().getTime();
$.ajax({
type: 'post',
url: '/url/to/post' + '?time=' + time,
data: {
"some": "data"
},
success: function(data) {
postComplete = true;
alert(data);
}
error: function() {
postComplete = true;
}
});
if (!postComplete)
setTimeout(ask, 500);
}
});
</script>
... хотя это все еще не решает проблему сеанса.