socket_set_timeout - bug!!! коннект не рвется (Freebsd + PHP4.3.11)

Mozer

Новичок
socket_set_timeout - bug!!! коннект не рвется (Freebsd + PHP4.3.11)

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

Ан нет, все проверив и создав нечто вроде лога выясняется, что даже по прошествии указанного в функции времени соединение остается нетронутым - вытягиваю стутус, а внем как обычно - сокет жив. И так на каждом цикле.

Я в гневе!

Система: Freebsd + PHP4.3.11
 

ONK

Пассивист PHPСluba
Что-то я не понял, ты устанавливаеш таймаут, начинаеш читать сокет, он "читается медленно" и по истечению таймаута чтение не прекращается.

Или ты делаш что-то другое?
 

Mozer

Новичок
Изначально я пробовал устанавливать таймаут только на чтение, тоесть ставил до функции fgets + у меня стоит NON block соединение, поэтому цикл не дожидается подключения, а идет дальше выполнять следующие операции. На каждом цикле дополнительно проверяется статус сокета, жив ли он или нет. И каждый раз он инициализируется как alive.

Так проходит час, другой, цикл уже в тысячный раз обходит этот злополучный сокет, fgets ничего не считывает, а коннект не закрывается и скрипт висит в памяти ожидая окончания операции, хотя я установил тайм аут = двум минутам. На аппарутуре дядюшки Билла все тип-топ, а на FreeBSD воть такая вот феня :mad:

-~{}~ 23.04.05 16:41:

"читается медленно" и по истечению таймаута чтение не прекращается.
Нет, скорость считывания с удаленного сервера нормальна и не вызывает нареканий.

Если удаленный сервер уже отдал порцию инфы в ответ, то чтение благополучно выполняется и завершается.

Скрипт же зависает не во время чтения уже поступившей инфы, а до, в тот момент когда ожидает поступления данных не обращая внимания на установленный таймаут в две минуты.

грубо говоря вот такой цикл:

PHP:
while (Пока не конец feof файла A)
{         
         Здрасти, я, тупой скрипт, пытаюсь считать этот
         долбаный файл A с сервера B, конструкцией
         $maza = fgets($socket, 2048);
         
         Далее вне зависимости от того, получил ли я инфу в
         $maza, я проверяю состояние сокета:
         $info = socket_get_status($socket);
         if ($info['timed_out'])
         {
                  exit ('Урра, свершилось, я закончил свою работу,
                  поскольку сработал таймаут утсановленный моим
                  админом');
         }
}
Говоря в кратце, цикл продолжает делать обороты, каждый проверяя состояние сокета так и не получая таймаут.
 

ONK

Пассивист PHPСluba
В этом случае таймаут ты можеш отсчитывать сам в скрипте.

socket_set_timeout нужен для того чтобы ограничить время чтения сокета (ведь в него можно злонамеренно медленно писать).
 
Сверху