Несколько возвращаемых значений 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, это означает, что новый контент прибыл, и вы можете получить к нему доступ. Техника называется комета.
а также...
Итак, наконец, да, это возможно, нет, это не легко.