За последние 24 часа нас посетили 34100 программистов и 1314 роботов. Сейчас ищут 992 программиста ...

Как выйти из цикла получения контента?

Тема в разделе "PHP для новичков", создана пользователем блудный сын, 27 июл 2008.

  1. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Получаю через сокет страничку, но часто сервер не указывает размер странички и у меня не происходит естественный выход из цикла, а выдается ошибка про превышение 30 секунд выполнения скрипта в строке $line .=fgets($fp);
    PHP:
    1.  
    2. while(!feof($fp))
    3. {
    4.     $line .=fgets($fp);
    5.     }
    6.  
    Подскажите, как определить, что документ загружен и можно принудительно выйти из цикла и выполнять код дальше?
     
  2. Anonymous

    Anonymous Guest

    признак EOF не связан с «размером странички указанной сервером». Ошибка в другом месте.
     
  3. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Для https тоже?
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. Connection: close
    установил?
     
  5. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ты не понял. Я скриптом с чужого сервера получаю страницу. Поэтому Connection: close он устанавливает. И действительно, я глянул заголовки получаемые с сервера и там Connection: close нет. Вот что там:
    Код (Text):
    1.  
    2. HTTP/1.1 200 OK
    3. Server: Resin/3.1.3
    4. Content-Type: text/html; charset=UTF-8
    5. Transfer-Encoding: chunked
    6. Date: Sun, 27 Jul 2008 10:38:55 GMT
    Наверно из-за этого из цикла выход и не происходит. Вот я сейчас за циклом специально поставил вывод текста через echo, но до него выполнение кода не дошло, а выдало ошибку о превышении времени в этой строке $line .=fgets($fp); Но страничка в переменную $line загружена полностью. Это я проверил сохранив полученные данные в файл с помощью следующего модифицированного кода.
    PHP:
    1.  
    2. while(!feof($fp))
    3.         {
    4.         $line .=fgets($fp);
    5.             $gg = fopen ("line.txt", "w+");
    6.             fwrite ($gg,$line);
    7.             fclose($gg);
    8.         }
    9. echo "Hello";
    10.  
     
  6. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Я говорю не про сервер, а про твой скрипт. Установи
    PHP:
    1. Connection: Close
     
  7. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    А причем тут это? Это ведь может быть причиной в случае если север не отвечает и ждет от скрипта данные... А так я отправил на сервер запрос. Сервер мой запрос понял и прислал мне ответ. Но скрипт понять, что данные получены полностью не может. И все ждет их и ждет... Или я ошибаюсь?
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
     
  9. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Что-то здесь не так... Я беру заголовки из файла и они 1:1 такие же, какие послал бы браузер... И я испытывал для других серверов - все работает. Но этот проблемный сервер не шлет строку с указанием Connection: И для него мой скрипт не работает. Может проблема таки в этом?
     
  10. Anonymous

    Anonymous Guest

    Твой скрипт - не браузер. И не умеет persistent connection. Поэтому ты должен послать заголовок о том, чты ты это не умеешь.
     
  11. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Браузер поддерживает Keep-Alive соединения. Что тут не понятно? Отправляя Connection: Close ты просишь сервер закрыть соединение.

    Посмотри что шлёт твой браузер:
    И что отвечает сервер:
     
  12. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Так я же этим себя выдам? Типа что это не браузер, а скрипт? Не хотелось бы этого... Может все таки можно как-то обучить мой скрипт понимать, что данные получены и передавать управление следующим строкам?
     
  13. Anonymous

    Anonymous Guest

  14. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Не парь нам мозги. Тебе сказали как правильно сделать.
     
  15. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Ещё какой...
     
  16. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Правильно! Когда моему скрипту сервера отвечают Connection: keep-alive - скрипт это понимает и цикл заывершается. А этот сервер вообще не шлет в заголовке слово Connection: и это видать и вводит скрипт в ступор.
     
  17. Anonymous

    Anonymous Guest

    Точно, капец.
     
  18. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Вот все что в заголовках от сервера:
    Код (Text):
    1.  
    2. HTTP/1.1 200 OK
    3. Server: Resin/3.1.3
    4. Content-Type: text/html; charset=UTF-8
    5. Transfer-Encoding: chunked
    6. Date: Sun, 27 Jul 2008 10:38:55 GMT
    Нет здесь указания на Connection: . Вообще. Нинакакой. Понимаете? Даже если я ему пошлю Connection: Close нет гарантии, что в его ответе в заголовке слово Connection: появится. И поэтому опять же мой скрипт зависнет. Поэтому зря вы ругаетесь. И заметьте, тот сервер не Апач.
     
  19. Anonymous

    Anonymous Guest

    Угадай, почему заголовки сервера называются заголовкам ОТВЕТА?
    потоколу - пофиг
     
  20. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ладно, сейчас дополню скрипт, чтобы вставлял вместо Connection: keep-alive - Connection: Close ...
    Посмотрим...
     
  21. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ну что ж, вынужден признать, что вы оказались правы! Как только я начал слать на сервер вместо Connection: keep-alive - Connection: Close , то и от него появился в ответе Connection: Close и скрипт заработал. Спасибо! :)
     
  22. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Йа пад стулом
    Зы. блудный сын завязывай с травкой переходи на alcohol =))
     
  23. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ну чего ты подустулом? Чего? Откуда мне было знать, что $line .=fgets($fp); так просто не понимает, что файл уже загружен? По идее это недоработка в функции, раз она не умеет persistent connection. Надеюсь в 5.3.х релизе ее этому научат.
     
  24. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    да не в этом дело,
    просто сколько времени прошло прежде чем ты попробовал добавить в запрос Connection: Close
     
  25. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Это потому что скрипт у меня для других серверов работал и без Connection: Close. Я вообще первый раз встречаю, что сервер не дает никакого ответа в поле Connection: . И хотел бы на своем сервере такую фичу сделать - не смог бы...