Вопрос

У меня есть 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, либо вызов заголовка завершится неудачно. Поэтому я рекомендую вам пересмотреть свой подход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top