Мне не удается заставить работать директиву Timeout, я воспроизвел проблему в приведенных ниже инструкциях и в официальном контейнере Docker. Сервер использует стандартную предварительную модель MPM с конфигурациями по умолчанию. Я понимаю, что таймаут должен возвращать ошибку 500 после тайм-аута или какой-то код ответа 4xx или 5xx, но это не так. Мое понимание неверно?
Настроить:
mkdir /tmp/test; cd /tmp/test
echo "<?php sleep(10);" > index.php
docker run -d -p 80:80 --name apache-php -v "/tmp/test":/var/www/html php:5.6-apache
time curl http://localhost/ # should take 10 seconds
Теперь уменьшите время ожидания до 1 секунды:
docker cp apache-php:/etc/apache2/apache2.conf . # Copy to host, since container doesn't have editor.
echo "Timeout 1" >> apache2.conf # Set Timeout to 1, default is 300.
docker cp apache2.conf apache-php:/etc/apache2/apache2.conf # Copy conf file back to container
docker exec -it apache-php /bin/bash
service apache2 reload
exit # exit docker container.
Проверить на ошибку:
time curl http://localhost/ # Here is where I expect a timeout error, but it works just the same as before and takes 10 seconds.
p.s. Я читал, что AcceptFilter может влиять на вещи, пока запрос не пройдет мимо него. У нас также есть конфигурация ниже:
AcceptFilter http none
AcceptFilter https none
Тайм-аут Apache означает тайм-аут TCP, а не время выполнения скрипта. Тайм-ауты PHP контролируются двумя директивами, расположенными в php.ini:
С php.net
max_input_time = integer
This sets the maximum time in seconds a script is allowed to parse input
data, like POST and GET. Timing begins at the moment PHP is invoked at the
server and ends when execution begins. The default setting is -1, which means
that max_execution_time is used instead. Set to 0 to allow unlimited time.
И (наверное, это то, что вам нужно)
max_execution_time = integer
This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server.
The default setting is 30. When running PHP from the command line the default setting is 0.
The maximum execution time is not affected by system calls, stream operations etc. Please see the set_time_limit() function for more details.
You can not change this setting with ini_set() when running in safe mode. The only workaround is to turn off safe mode or by changing the time limit in the php.ini.
Your web server can have other timeout configurations that may also interrupt PHP execution. Apache has a Timeout directive and IIS has a CGI timeout function.
Both default to 300 seconds. See your web server documentation for specific details.