Несколько возвращаемых значений php с помощью jquery $.post

Я действительно не знаю, как спросить это, поэтому я спрашиваю это здесь. Так что, если бы я использовал некоторый код, подобный этому:

$.post("/data/something.php", {stuff: 'hi'}, function(data){
$('#box').html(data);
});

Обычно, если у вас есть php, как этот, вы получите только 1 результат:

<?php echo $_REQUEST['stuff'] ?>

Мне было интересно, есть ли способ для php посылать немного данных, а потом немного позже, не отправляя все сразу, вот так:

<?php 
echo 'Foo';
//Do stuff that takes time
echo 'Bah';
?>

3 ответа

Решение

Есть 2 способа сделать это.

Первый использует стандартный рабочий процесс с flush команда ( http://php.net/manual/en/function.flush.php). Это означает, что вы можете сделать:

echo "Starting...\n"
flush();
// do long task
echo "Done!\n"

ОДНАКО: Это часто не работает. Например, если ваш сервер использует deflate, Starting скорее всего, не будет отправлено, пока запрос не будет завершен. Это может быть вызвано и многими другими факторами (прокси, поведение браузера).

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

В PHP

<?php 
    echo 'Foo';
    echo '||||';
    echo 'Bah';
?>

В JavaScript

var responses = data.split('||||');

//you will get 
//Foo in responses[0]
//Bar in responses[1]

Я ожидаю, что php не имеет проблем с этим (как подробно описано @Dave). Сложная часть, для javascript, чтобы получить первую часть данных, прежде чем передача завершится...

Я думаю, что на ваш вопрос ответили здесь: возможно ли прочитать AJAX-запрос до того, как ответ будет завершен?

Способ сделать это - прослушать readyState в объекте xhr. Когда readyState == 3, это означает, что новый контент прибыл, и вы можете получить к нему доступ. Техника называется комета.

а также...

Итак, наконец, да, это возможно, нет, это не легко.

Другие вопросы по тегам