PHP usleep / sleep внутри выходного буфера
-
10-07-2019 - |
Вопрос
У меня есть PHP-приложение, содержащее эти файлы: landing.php, redirect.php, ajax.php
при вызове страницы в landing.php я выполняю код javascript для захвата определенных данных и выдаю AJAX POST для ajax.php , который вставляет их в БД , Наконец, php header () перенаправляет на redirect.php
В настоящее время вышеприведенная функция использует буферизацию вывода, но header () выполняется слишком рано, так что 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();
?>
Решение
Если я вас правильно понял, у вас есть фундаментальное недопонимание того, как работают веб-приложения.
Ваш PHP-сценарий не может дождаться выполнения бита AJAX, поскольку весь сценарий сначала запускается на сервере, а выходные данные, часть которых является вызовом AJAX, затем отправляются в браузер. Вы должны переосмыслить то, как вы это делаете.
Например, вы могли бы сначала сделать так, чтобы JavaScript выполнял вызов AJAX, а затем перенаправлять браузер.
Редактировать: ОК, теперь, когда я еще немного об этом подумал, я вижу, как что-то подобное может работать, когда вы не используете буферизацию вывода, если браузер выполняет сценарий, как только он его видит (без полной загрузки страницы). Если это действительно так, то вы по-прежнему полагаетесь на синхронизацию браузера, качество интернет-соединения пользователя и т. Д., Чтобы поддерживать синхронизацию. Это определенно не хорошая вещь.
Однако единственный способ, который может сработать, - это если AJAX-вызов выводится в браузер до вызова заголовка - что невозможно! Заголовки должны быть отправлены до содержимого в ответе HTTP (именно поэтому вы используете буферизацию вывода в первую очередь), поэтому либо вы не будете выводить JavaScript, либо вызов заголовка завершится неудачно. Поэтому я рекомендую вам пересмотреть свой подход.