Вывод сообщений от сервера (PHP), в пределах одного ajax-запроса

Sanu0074
На сайте с 31.08.2012
Offline
110
1908

Есть страница с формой отправки файла, этот файл отправляется на сервер где с ним могут проделываться разные операции (очень долгая, более 15сек), и информация об этом выводится скриптом по ходу выполнения. Тут же назревает вопрос о том как заставить сервер выводить сообщения немедленно, а не после завершения работы скрипта.

Например что-то отсылаем:

$.ajax({

type: 'POST',
url: script,
data: data,
success: function(data) {
//вывод
}
});

В это время сервер выдает какие-то сообщения но операция еще не завершается и эти сообщения моментально приходят клиенту.

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

Как это реализовать? подскажите подобные примеры...

LEOnidUKG
На сайте с 25.11.2006
Online
1722
#1

Записывать данные в TXT файлик и с чего переодически считывать.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Sanu0074
На сайте с 31.08.2012
Offline
110
#2

LEOnidUKG, я об этом и написал, но нужен же какой-то другой вариант... и с iframe - тоже плохой вариант

Mad_Man
На сайте с 10.11.2008
Offline
162
#3

Есть ещё P2P передача данных в последних версиях мажорных браузеров через WebRTC. Помимо этого только постоянный долбёж, сокеты реализовать на стороне юзверя довольно проблематично.

ДП
На сайте с 23.11.2009
Offline
203
#4

Был когда-то такой скрипт rapidget - для скачки с файлообменников на сервер свой.

Насколько помню там прогресс реализовывался в виде выдачи яваскрипта, который браузер выполнял. А этот скрипт обновлял индикатор прогресса.

Т.е. сервер в пределах одного ответа выводил несколько тегов

<script></script> по мере готовности. В подробностях не копал, могу ошибаться, но вроде так это было сделано.

LEOnidUKG
На сайте с 25.11.2006
Online
1722
#5

Дикий пионер, это не прокатит если на серваке стоит nginx. Он ничего не отдаст пока всё не будет загружено.

vob2014
На сайте с 30.03.2014
Offline
91
#6

есть еще вебсокет во всех текущий версиях браузеров, а еще есть пуш уведомления с сервера, тоже вроде во всех основных браузерах текущих версиях. Но там придется подумать над серверной частью. А чем не устраивает тем же аяксом периодически запрашивать статус операции? по моему просто и удобно и на сервере особых проблем нет.

опрашивать содержание текстового файла с информацией об операциях с файлом

зачем текстовый файл? вовсе не обязательно, ведь инфу о статусе можно хранить в шаредной памяти, или в базе. iframe это вообще из прошлого века когда не было аякса.

Mad_Man - P2P это как я понимаю один-к-одному, а если несколько юзеров одновременно много разных файлов процессируют? imho в многопользовательской системе P2P не подходит в принципе.

Наконец можно сделать на ява-аплете или сильверлайте-дот-нете (С#), там вроде в отличие от ява-скрипт нет проблем с сокетами и на клиенте и на сервере. Ява и Сильверлайт(C#) плугины есть для всех браузеров.

...
Sanu0074
На сайте с 31.08.2012
Offline
110
#7

vob2014, вебсокет - это лучший вариант как по мне, но это требует мороки на стороне сервера

vob2014
На сайте с 30.03.2014
Offline
91
#8

кажется ты не обратил внимание на то, что аякс - асинхронный, то есть послав запрос прога не виснет, а продолжает работать и никто не мешает послать еще другие аякс запросы. Вебсокет (при наличие аякса и асинхронности) мне кажется не нужен или мягче говоря - мало актуален. Ну и наконец сейчас в лису-оперу-эксплорер-хром добавили и восе параллельные вычисления, так что даже долгий блокирующий НЕ яакс запрос к серверу можно вынести в параллельный процесс и скрипт не заблокируется. Так что периодический опрос состояния обработки на сервер с клиента через аякс по таймеру имхо оптимальный вариант не требующий установки асинхронных фреймворков на сервер как в случае с вебсокетоами (там нужен как минимум node.js) - все легко делается на банальном php даже на шаредном хостинге (много-клиентность там автоматом апач/сервер сам сделает).



то есть сама постановка вопроса в топике изначально ошибочна!

нет никакого внутри.

запрос посылается и мгновенно управление возвращается основному потоку ява-скрипт.

результат же хоть через час, когда появится тогда и дернет вот это твое

success: function(data) {
//вывод
}

а пока не дернет ты НЕ внутри аякс запросы, ты в основном потоке своей страницы (ява скрипта страницы, а не внутри аякс запроса) и можешь посылать другие аякс запросы.

тебя ввел в заблуждение синтаксис ява-скрипта

$.ajax({

type: 'POST',

url: script,

data: data,

success: function(data) {

//вывод

}

});

но пойми, несмотря на то что fucntion находится как бы внутри вызова яакса на самом деле она снаружи, и вызовется не внутри, а снаружи, когда будет готов ответ сервера.

Это достаточно заумная хреновина, когда объявляется безымянная ф-ия, кажется ее нельзя вызвать потом так как у нее нет имени, но можно! без имени! по внутреннему идентификатору тебе не видимому.

Прогеры пишущие такие коды очень гордяться собой ибо простому смертному типа тебя понимание этого не доступно :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий