Прервите соединение с браузером, прежде чем скрипт завершится - PullRequest
1 голос
/ 07 марта 2012

У меня есть скрипт, который берет загруженный текстовый файл, анализирует его, а затем вставляет немало строк в базу данных. Этот процесс занимает около минуты.

Несмотря на то, что я использую AJAX, я не хочу, чтобы мои пользователи видели «Загрузка ...» более минуты, пока база данных заполнена. На самом деле, как только синтаксический анализ завершится успешно, база данных INSERTS всегда будет работать, потому что все проверяется во время синтаксического анализа.

Так что мне нужно сделать, это вернуть строку JSON {success:true,data:{cartons: 1000, batchname:"Batch1"}}, как только разбор пройдет успешно. Я делаю это, но браузер не анализирует ответ до тех пор, пока соединение не будет закрыто (сценарий завершен). Есть ли способ заставить браузер принять ответ по мере его поступления, или я должен закрыть соединение с браузером, пока мой PHP скрипт продолжает работать?

Я использую ExtJS в качестве среды Javascript, которая обрабатывает AJAX. Есть идеи? Это ломало мне голову около недели.

1 Ответ

1 голос
/ 07 марта 2012

Просто укажите длину содержимого тела ответа:

  $out = 'Return this';
  header("Content-Length: " . strlen($out));
  header("Connection: close");
  echo $out;
  flush();
  echo 'But do not return this';
  // create some file to show that script continues its execution 
  file_put_contents('script.is.running', '');

Также вы можете запускать другие сценарии из командной строки в фоновом режиме (не дожидаясь их завершения) или выполнять http-запрос к сценарию с функцией ignore_user_abort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...