Скажите можно ли сделать асинхронный обмен на PHP в серверной части. Тобишь что-то типа: браузер послал запрос, скрипт послал ответ и как то послал запрос другому скрипту, который как то ответил в браузер. Тоесть у юзера происходит обновление страницы как бы. Дя, наверно это бред....
Не, на самом деле можно сделать похоже, только синхронно. Первый раз сервер отправляет вместе с ответом заголовок о обновлении страницы через 5 сек и запоминает, что это был первйы запрос. Код (Text): |--------| |--------| | |<============| | | Сервер | Refresh: 5 | Клиент | | |============>| | |--------| |--------| Второй раз при получении запроса сервер соединяется с другим сервером, получает контент и отправляет его клиенту в ответ. Код (Text): |--------| 1 |--------| | |<===| | | Сервер | 3 | Клиент | | /=====|===>| | |--||----| |--------| 2|| \/ |--------| | Сервер | |--------| Браузер закрывает соединение после получения ответа, поэтому прислать что-то браузеру не получив запроса не получится.
значит делай так, как [vs] написал. Но тогда могут быть свои затыки. Например второй сервер будет плеваться. В общем у меня была такая задача: сделать автодополнение, забирая ответы с другого сервера.
значит делай так, как [vs] написал. Но тогда могут быть свои затыки. Например второй сервер будет плеваться. В общем у меня была такая задача: сделать автодополнение, забирая ответы с другого сервера. Я имел в виду так: [js] $.ajax({ onSuccess : function(response) { switch (response.stasus) { case 'error': // smth. break; case 'ok': // smth. break; case 'needRequest': // $.ajax to another server break; } } });[/js]
не задачи - это идеи. Koc Может ты не понял. Я имею в виду асинхронность с "серверной стороны". Про аджакс я знаю и вообще тут о нем не говорю. Допустим скрипт выполнил быструю часть задачи, вернул результат, и поручил медленную часть другому скрипту. Другой скрипт, выполнив медленную часть, отправил данные по тому же соединению что и соединялся первый. То есть то что написал [vs], это вообще другое - тут первый скрипт ждет завершения второго. В моем случае он не должен ждать. Я пробовал эмулировать это, делая все одним скриптом, экспериментируя с ob_*, но у меня не выходило. Ну как то же можно выплюнуть кусок буфера, а остальное отдать через 30 секунд?
Никак. Браузер ждет некоторое время, потом решает что, что ответа не будет. При чем timeout этот разный у разных браузеров.
Если надо по событию на сервере в браузере что-то обновить, сделай на JS обёртку, которая будет чекать на сервере события. И как сервер ответил, что произошло какое-то событие - на стороне JS делай соотвествующие действия. Это же просто как 2 + 2. Главное подобрать правильный интервал для проверки состояния на сервере - не слишком короткий, что бы запросы не шли сшишком часто, но и достаточно не большой, что бы реакция была-бы более-менее своевременной. Я бы взял от 3 до 7 секунд. Единственное что нужно учесть - запросы надо делать один за другим. т.е. не тупо ставить setInterval, а через 3 секунды после прихода ответа, иначе если случится какой-то затык и запрос будет делаться слишком долго - они могут начать скапливатся. В остальном просто включить асинхронный режим, тогда проверка события и реакции на события можно делать паралельно и они не будут друг другу мешать. Кстати, да! На самом деле push сообщения в браузер возможны - с помощью Flash можно поддерживать постоянное соединение с сервером. Естественно что для этого нужен сервер в виде демона и flash умеющий вызывать JavaScript для реакции и обновления данных в браузере. Но думаю этот вариант не очень подойдёт из-за сложности и трудоёмкости