Получаю через сокет страничку, но часто сервер не указывает размер странички и у меня не происходит естественный выход из цикла, а выдается ошибка про превышение 30 секунд выполнения скрипта в строке $line .=fgets($fp); PHP: while(!feof($fp)) { $line .=fgets($fp); } Подскажите, как определить, что документ загружен и можно принудительно выйти из цикла и выполнять код дальше?
Ты не понял. Я скриптом с чужого сервера получаю страницу. Поэтому Connection: close он устанавливает. И действительно, я глянул заголовки получаемые с сервера и там Connection: close нет. Вот что там: Код (Text): HTTP/1.1 200 OK Server: Resin/3.1.3 Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Date: Sun, 27 Jul 2008 10:38:55 GMT Наверно из-за этого из цикла выход и не происходит. Вот я сейчас за циклом специально поставил вывод текста через echo, но до него выполнение кода не дошло, а выдало ошибку о превышении времени в этой строке $line .=fgets($fp); Но страничка в переменную $line загружена полностью. Это я проверил сохранив полученные данные в файл с помощью следующего модифицированного кода. PHP: while(!feof($fp)) { $line .=fgets($fp); $gg = fopen ("line.txt", "w+"); fwrite ($gg,$line); fclose($gg); } echo "Hello";
А причем тут это? Это ведь может быть причиной в случае если север не отвечает и ждет от скрипта данные... А так я отправил на сервер запрос. Сервер мой запрос понял и прислал мне ответ. Но скрипт понять, что данные получены полностью не может. И все ждет их и ждет... Или я ошибаюсь?
Что-то здесь не так... Я беру заголовки из файла и они 1:1 такие же, какие послал бы браузер... И я испытывал для других серверов - все работает. Но этот проблемный сервер не шлет строку с указанием Connection: И для него мой скрипт не работает. Может проблема таки в этом?
Твой скрипт - не браузер. И не умеет persistent connection. Поэтому ты должен послать заголовок о том, чты ты это не умеешь.
Браузер поддерживает Keep-Alive соединения. Что тут не понятно? Отправляя Connection: Close ты просишь сервер закрыть соединение. Посмотри что шлёт твой браузер: И что отвечает сервер:
Так я же этим себя выдам? Типа что это не браузер, а скрипт? Не хотелось бы этого... Может все таки можно как-то обучить мой скрипт понимать, что данные получены и передавать управление следующим строкам?
Правильно! Когда моему скрипту сервера отвечают Connection: keep-alive - скрипт это понимает и цикл заывершается. А этот сервер вообще не шлет в заголовке слово Connection: и это видать и вводит скрипт в ступор.
Вот все что в заголовках от сервера: Код (Text): HTTP/1.1 200 OK Server: Resin/3.1.3 Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Date: Sun, 27 Jul 2008 10:38:55 GMT Нет здесь указания на Connection: . Вообще. Нинакакой. Понимаете? Даже если я ему пошлю Connection: Close нет гарантии, что в его ответе в заголовке слово Connection: появится. И поэтому опять же мой скрипт зависнет. Поэтому зря вы ругаетесь. И заметьте, тот сервер не Апач.
Ладно, сейчас дополню скрипт, чтобы вставлял вместо Connection: keep-alive - Connection: Close ... Посмотрим...
Ну что ж, вынужден признать, что вы оказались правы! Как только я начал слать на сервер вместо Connection: keep-alive - Connection: Close , то и от него появился в ответе Connection: Close и скрипт заработал. Спасибо!
Ну чего ты подустулом? Чего? Откуда мне было знать, что $line .=fgets($fp); так просто не понимает, что файл уже загружен? По идее это недоработка в функции, раз она не умеет persistent connection. Надеюсь в 5.3.х релизе ее этому научат.
да не в этом дело, просто сколько времени прошло прежде чем ты попробовал добавить в запрос Connection: Close
Это потому что скрипт у меня для других серверов работал и без Connection: Close. Я вообще первый раз встречаю, что сервер не дает никакого ответа в поле Connection: . И хотел бы на своем сервере такую фичу сделать - не смог бы...