2015-02-03 3 views
-3

Я пытаюсь опубликовать некоторые данные до post.php, и я хочу, чтобы результат отображался в form.html, я использовал Ajax для получения вывода php без необходимости перезагрузки страницы, t выяснить, как очистить некоторые из php-вывода до завершения php-скрипта.ajax обновление в реальном времени без обновления страницы php

Я пробовал flush() и ob_flush(), но кажется, что они не работают при использовании с Ajax. Моя цель - update form.html в режиме реального времени без перезагрузки страницы.

Вот пример того, чего я пытаюсь достичь. Исходный код:

form.html

<html> 
<head> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 
    <script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function(){ 
      $("#myform").validate({ 
       submitHandler: function(form) { 
        // do other stuff for a valid form 
        $.post('post.php', $("#myform").serialize(), function(data) { 
         $('#results').html(data); 
        }); 
       } 
      }); 
     }); 
    </script>  
</head> 
<body> 
    <form name="myform" id="myform" action="" method="POST"> 
    <!-- The Name form field --> 
     Name: 
     <input type="text" name="name" id="name" size="30" value=""/> 
     <br> 
    <!-- The Email form field --> 
     Email: 
     <input type="text" name="email" id="email" size="30" value=""/> 
     <br> 
    <!-- The Submit button --> 
     <input type="submit" value="Submit"/></div> 
    </form> 

    <!-- Result goes here --> 
    <div id="results"><div> 
</body> 
</html> 

post.php

<?php 

for($i=0;$i<2;$i++) { 
    echo "Your Name is ".$_POST['name']. "<br/>"; 
    echo "Your E-mail is".$_POST['email']."<br/>"; 
    echo "Waiting 2s <br/><br/>"; 
    //I want to print the above before waiting 2 seconds. 
    sleep(2);// in real application this will be equivalent of some calculation that takes time. 
} 
?> 
+2

Что точка 'сна()' в PHP? Почему бы просто не использовать JavaScript 'setTimeout()' вместо этого? –

+0

Попробуйте просто отозвать некоторые данные теста без использования цикла for. Что происходит? – 12hys

+0

Google this => «ajax reload page every x seconds» –

ответ

1

Ваш вторит уже может быть отправлен в браузер клиента, а клиент будет продолжаться дольше, пока ваш PHP-скрипт не завершится. Вам нужно отключить клиента раньше, например: до sleep(2). Попробуйте следующее:

ignore_user_abort(true); 
    // Disconnect with the client 
    if (!connection_aborted()) { 
     $response = 'your response'; 
     header('Content-Length: ' . strlen($response)); 
     header('Connection: close'); 
     echo $response; 
     flush(); 
    } 

Обратите внимание, что пожалуйста, не делайте других эхо до выше кода блока. Весь ваш выход должен быть в $response, так как должен быть рассчитан правильно.

0

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


Это может быть альтернативой вашей первоначальной идеи: пример AJAX-стиля многоэтапной операции:

Backend: post.php:

<?php 
echo "Your Name is ".$_POST['name']. "<br/>". 
    "Your E-mail is".$_POST['email']."<br/>". 
    "Will now continue with calculation job ..."; 

// store the values inside db, create session and return content 
... 

после расчета .php

<?php 
// longer running script doing stuff 
... 
print 'Done.'; 

Frontend:

Измените сценарий следующим образом:

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $("#myform").validate({ 
      submitHandler: function(form) { 
       // do other stuff for a valid form 
       $.post('post.php', $("#myform").serialize(), function(data) { 
        // will return the content from post.php  
        $('#results').html(data); 

        // now call the second process 
        $.ajax('post-calculation.php', { 
        success: function(result) { 
         $('#results').append(result); 
        } 
        }); 

       }); 
      } 
     }); 
    }); 
</script> 

Примечания:

Это следует рассматривать только как пример, а не как хорошая практика, как выполнять AJAX звонки с многоступенчатая операция. Целесообразно использовать выходные форматы, которые позволяют скрипту реагировать на ошибки, которые могут возникать при вызове backend-скрипта, т.е.через не возвращающий HTML-код, а JSON вместо [1]. Вы можете захотеть сохранить часть ранее полученных данных внутри переменной $ _SESSION для повторного использования данных впоследствии в более позднем запущенном скрипте, не забудьте всегда вызывать session_start(); перед тем, как вы получите доступ к объекту сеанса.

[1] http://www.sitepoint.com/ajaxjquery-getjson-simple/ (простой учебник)

Смежные вопросы