PHP usleep / sleep внутри выходного буфера - PullRequest
0 голосов
/ 03 августа 2009

У меня есть PHP-приложение, содержащее эти файлы: landing.php, redirect.php, ajax.php

при вызове страницы к landing.php я выполняю код javascript для сбора определенных данных и выдаю AJAX POST для ajax.php , который вставляет их в БД. Наконец php header () перенаправляет на redirect.php

В настоящее время вышеприведенная функция использует буферизацию вывода, но заголовок () выполняется слишком рано, чтобы завершить AJAX POST .. то есть запрос БД не выполняется.

Я пытался использовать sleep () usleep () до header () , но они не работают. Поскольку я не очень хорошо знаком с выходной буферизацией, не могли бы вы предложить добрую руку?

Спасибо.

<?php ob_start(); ?>

<scripts type="text/javascript">
var data = 'blah..blah..blah..';
ajaxPost('ajax.php', data);
</scripts>

<?php
sleep(2);    // <---- I want the script to sleep here and wait for the AJAX to finish
header('c.php)
ob_end_flush();
?>

1 Ответ

3 голосов
/ 03 августа 2009

Если я вас правильно понял, у вас есть фундаментальное недопонимание того, как работают веб-приложения.

Ваш PHP-сценарий не может дождаться выполнения бита AJAX, поскольку весь сценарий сначала запускается на сервере, а выходные данные, часть которых является вызовом AJAX, затем отправляются в браузер. Вы должны переосмыслить то, как вы это делаете.

Например, вы могли бы сначала сделать так, чтобы JavaScript выполнял вызов AJAX, а затем перенаправлять браузер.

Редактировать: ОК, теперь, когда я немного подумал об этом, я вижу, как что-то подобное может работать, когда вы не используете буферизацию вывода, если браузер выполняет скрипт как только он это увидит (не загрузив полную страницу). Если это действительно так, то вы по-прежнему полагаетесь на синхронизацию браузера, качество интернет-соединения пользователя и т. Д., Чтобы поддерживать синхронизацию. Это определенно не хорошая вещь.

Однако единственный способ, который может сработать, - это если вызов AJAX выводится в браузер до вызова заголовка - что невозможно! Заголовки должны быть отправлены до содержимого в ответе HTTP (именно поэтому вы используете буферизацию вывода в первую очередь), поэтому либо вы не будете выводить JavaScript, либо вызов заголовка завершится неудачно. Поэтому я рекомендую вам пересмотреть свой подход.

...