Допустим, есть серверный процесс, который занимает слишком много времени. Клиент жалуется на то, что он «вышел из строя».
Поправьте меня, если я ошибаюсь, но этот конкретный тайм-аут может быть связан с настройкой тайм-аута apache, но не обязательно. Я полагаю, что это так, потому что при тестировании рассматриваемой страницы мы не могли надежно рассчитать время ее ожидания - в основном браузер просто вращался бы столько времени, сколько потребовалось.
Настройка времени ожидания вступит в силу, если возникнут проблемы с подключением к клиенту, как описано в документации . Но если с подключением все в порядке, клиент должен был закрыть его (я верю).
Я предположил, что это также означало, что если клиент закрыл свой браузер, Apache достигнет лимита тайм-аута (в моем случае 300 секунд) и завершит процесс. Похоже, это не так.
Вот как я это проверил:
Я добавил цикл while для некоторого кода на сервере:
too_long = 2000
tstart = time.time()
f = open('/tmp/timeout_test.txt', 'w')
while True:
time.sleep(100)
elapsed = time.time() - tstart
f.write('Loop, %s elapsed\n' % elapsed)
if elapsed > too_long:
break
Затем я открываю веб-страницу для запуска этого цикла и запускаю netstat на сервере:
~$ netstat -np | grep ESTAB | grep apache
tcp 0 0 10.102.123.6:443 10.102.119.101:53519 ESTABLISHED 16534/apache2
tcp 0 0 127.0.0.1:60299 127.0.0.1:5432 ESTABLISHED 16534/apache2
(это я на 10.102.119.101, сервер на 10.102.123.6)
Затем я закрыл свой браузер и перезапустил эту строку netstat:
~% netstat -np | grep ESTAB | grep apache
tcp 0 0 127.0.0.1:60299 127.0.0.1:5432 ESTABLISHED 16534/apache2
Мое соединение исчезло, но сервер все еще был в цикле, я мог подтвердить, запустив:
~% lsof | grep timeout
apache2 16534 www-data 14w REG 8,1 0 536533 /tmp/timeout_test.txt
означает, что процесс apache все еще имел этот открытый файл. В течение следующих 2000 секунд, когда я бежал:
~% cat /tmp/timeout_test.txt
У меня ничего нет. Через 2000 секунд строка netcat вообще ничего не дала, и файл tmp был заполнен выводом из цикла while.
Итак, похоже, что процесс Apache просто выполняет то, что ему было предложено, независимо от клиентского подключения? А что это за петлевое соединение?