За последние 24 часа нас посетили 17940 программистов и 1611 роботов. Сейчас ищут 929 программистов ...

Большой while и Ajax запрос

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

  1. ufx

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

    С нами с:
    19 июн 2007
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени суток.
    Ситуация следующая. Есть файл index.php в котором находится iframe с загруженным в него test.php.
    в test.php выполняется примерно следующее:

    Код (Text):
    1.  
    2. ob_start();
    3.  
    4. require('config.php');
    5.  
    6. // подключение к БД и выборка значений
    7.  
    8. while( $row = mysql_fetch_object($sql) ) {
    9.   // выполняем действие с $row
    10.    
    11.   echo 'результат работы с $row';
    12.   ob_flush();
    13.   flush();
    14.  
    15.   sleep(5);    // необходимо
    16. }
    17. ob_end_flush();
    в процессе работы из файла index.php идет ajax запрос каждые N секунд. и каждый из этих отправленных запросов подвисает до тех пор пока не отработает до конца test.php. Т.е. как только в test.php закончился while все запросы получают по респонсу и выводят результат, только первый ждет допустим 30секунд, второй 25..... и так далее, при обычном времени ожидания 8мсек.

    как заставить скрипт дать ответ запросу ajax при работающем в фоне test.php?

    протестировано на win 32 и debian. на обоих apache 2.2 и php 5.2.8

    заранее спасибо.
     
  2. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    мрак. ВСЕ так делать не надо.
     
  3. ufx

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

    С нами с:
    19 июн 2007
    Сообщения:
    4
    Симпатии:
    0
    содержательный ответ.
    лишь бы написать?
    что понимается под "ВСЕ"?
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    начиная от желания воткнуть sleep (все решается не так, но сначала надо расписать на русском что надо)

    желание есть убрать сумрак в голове и разобраться как писать по людски? или будем наезды искать?
     
  5. ufx

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

    С нами с:
    19 июн 2007
    Сообщения:
    4
    Симпатии:
    0
    не ожидал просто, что сразу будут пытаться учить.

    если это так необходимо (хотя на мой взгяд задача стоит точно) опишу словами:
    в БД хранится некоторая информация, ее надо оттуда извлекать и отправлять на сторонний сервер для проверки.
    в целях снижения нагрузки на сервер и ставится sleep(N), ибо данных может быть очень много (1K+) да и к серверу не только я запросы отправляю. от сервера необходимо получить ответ проверки и записать его обратно в БД.

    на интерфейс необходимо вывести следующую информацию: общее количество информации в БД, количество уже проверенной информации (в режиме реального времени в момент проверки - для этого используется ajax) и внутреннее имя информации в момент ее обработки в виде обычного текста.

    интерфейс должен быть под защитой http_auth с сессиями.

    результат: index.php отображает статистику и содержит в себе iframe, где по нажатию submit-кнопки запускается test.php который в себе содержит код, представленный в посте 1. также в index.php выводится javascript реализующий post ajax-запрос самому себе (т.е. к index.php) с параметром getstats=1, далее этот getstats ловится, делается запрос к бд с последующим echo json_encode($stats_result); exit();

    и вот теперь у меня вопросы: что тут реализовано "не по людски" и так ли было необходимо все это писать?
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    так ты готов разбираться что не так и как по уму?

    ??? как это снижает нагрузку?

    это много?
    в чем смысл "реального времени"?
    тебе надо обеспечить целостность информации и что еще? не путай задачу и реализацию.


    веб технологии (да и вообще любое вменяемое действие) работают по принципу "запрос-ответ", а не остановка открытого соединения и ожидание непонятно чего.

    асинхронность в виде аякса - это запрос и продолжение работы без ожидания ответа.

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

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

    давай все таки начнем с задачи, чтобы ты сам понимал что зачем делается. Это окупится, не только для этого случая.
     
  7. ufx

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

    С нами с:
    19 июн 2007
    Сообщения:
    4
    Симпатии:
    0
    на сервере при поступлении информации начинают запускаться огромные запросы к собственной БД. Какого рода эти запросы - я хз, к северу ни доступа, ни отношения не имею.

    ну... а что считать много? для каждого свое понятие

    под реальным временем я подразумеваю вывод на экран количества уже проверенной информации в момент проведения проверки. т.е в данный момент проверено 20 единиц из 100. в момент следующего запроса количество проверенного может как и увеличится так и нет, в зависимости от работающего в ифрейме скрипта проверки

    а как по-твоему достичь снижения нагрузки на сторонний сервер?

    по поводу задачи - она описана в моем предыдущем посте.