За последние 24 часа нас посетили 18696 программистов и 1659 роботов. Сейчас ищут 997 программистов ...

Ассинхронный обмен на PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем kostyl, 7 авг 2009.

  1. kostyl

    kostyl Guest

    Скажите можно ли сделать асинхронный обмен на PHP в серверной части. Тобишь что-то типа: браузер послал запрос, скрипт послал ответ и как то послал запрос другому скрипту, который как то ответил в браузер. Тоесть у юзера происходит обновление страницы как бы. Дя, наверно это бред....
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    низя
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    kostyl
    AJAX, just check every 5 seconds. It suffice, been there, done that.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Не, на самом деле можно сделать похоже, только синхронно.
    Первый раз сервер отправляет вместе с ответом заголовок о обновлении страницы через 5 сек и запоминает, что это был первйы запрос.
    Код (Text):
    1. |--------|             |--------|
    2. |        |<============|        |
    3. | Сервер |  Refresh: 5 | Клиент |
    4. |        |============>|        |
    5. |--------|             |--------|
    Второй раз при получении запроса сервер соединяется с другим сервером, получает контент и отправляет его клиенту в ответ.
    Код (Text):
    1.  
    2. |--------|  1 |--------|
    3. |        |<===|        |
    4. | Сервер |  3 | Клиент |
    5. |  /=====|===>|        |
    6. |--||----|    |--------|
    7.   2||
    8.    \/
    9. |--------|
    10. | Сервер |
    11. |--------|
    Браузер закрывает соединение после получения ответа, поэтому прислать что-то браузеру не получив запроса не получится.
     
  5. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а можно прислать браузеру такой ответ, на который он сам пошлет запрос на другой сервер.
     
  6. kostyl

    kostyl Guest

    header('Location: ....') или AJAX. А надо с другой стороны.
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    значит делай так, как [vs] написал. Но тогда могут быть свои затыки. Например второй сервер будет плеваться.
    В общем у меня была такая задача: сделать автодополнение, забирая ответы с другого сервера.
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    значит делай так, как [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]
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    откуда такие задачи
     
  10. kostyl

    kostyl Guest

    не задачи - это идеи.
    Koc
    Может ты не понял. Я имею в виду асинхронность с "серверной стороны". Про аджакс я знаю и вообще тут о нем не говорю. Допустим скрипт выполнил быструю часть задачи, вернул результат, и поручил медленную часть другому скрипту. Другой скрипт, выполнив медленную часть, отправил данные по тому же соединению что и соединялся первый. То есть то что написал [vs], это вообще другое - тут первый скрипт ждет завершения второго. В моем случае он не должен ждать. Я пробовал эмулировать это, делая все одним скриптом, экспериментируя с ob_*, но у меня не выходило. Ну как то же можно выплюнуть кусок буфера, а остальное отдать через 30 секунд?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Никак. Браузер ждет некоторое время, потом решает что, что ответа не будет. При чем timeout этот разный у разных браузеров.
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    kostyl
    так нельзя
    если только демоны, но я не уверен
     
  13. kostyl

    kostyl Guest

    Mr.M.I.T.
    да я уже понял, что так нельзя, когда первый пост писал )..
     
  14. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Если надо по событию на сервере в браузере что-то обновить, сделай на JS обёртку, которая будет чекать на сервере события. И как сервер ответил, что произошло какое-то событие - на стороне JS делай соотвествующие действия. Это же просто как 2 + 2. Главное подобрать правильный интервал для проверки состояния на сервере - не слишком короткий, что бы запросы не шли сшишком часто, но и достаточно не большой, что бы реакция была-бы более-менее своевременной. Я бы взял от 3 до 7 секунд. Единственное что нужно учесть - запросы надо делать один за другим. т.е. не тупо ставить setInterval, а через 3 секунды после прихода ответа, иначе если случится какой-то затык и запрос будет делаться слишком долго - они могут начать скапливатся. В остальном просто включить асинхронный режим, тогда проверка события и реакции на события можно делать паралельно и они не будут друг другу мешать.

    Кстати, да! На самом деле push сообщения в браузер возможны - с помощью Flash можно поддерживать постоянное соединение с сервером. Естественно что для этого нужен сервер в виде демона и flash умеющий вызывать JavaScript для реакции и обновления данных в браузере. Но думаю этот вариант не очень подойдёт из-за сложности и трудоёмкости :)