После нескольких часов поиска и отладки я сдаюсь!
Есть тысячи вопросов и статей о длительных процессах PHP, но ни один из них не решил мою проблему.
У меня есть скрипт PHP со следующими кодами:
$cur = 0;
// Second, loop for $timeout seconds checking if process is running
while( $cur < 31 ) {
sleep(1);
$cur += 1;
echo "\n ---- $cur ------ \n";
}
Он просто предназначен для работы в течение 31 секунды.
У меня есть Nginx, PHP настроен как fastcgi на сервере Debian.
Я поставил
max_execution_time = 600
В
/etc/php5/fpm/php.ini
Я даже установил это в
/etc/php5/cli/php.ini
Также установлено
request_terminate_timeout = 600
в
/etc/php5/fpm/pool.d/www.conf
Я также сделал эти изменения в разделе http nginx.conf
client_header_timeout 600;
client_body_timeout 600;
send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
client_max_body_size 600;
fastcgi_buffers 8 128k;
fastcgi_buffer_size 128k;
И поместите директивы в раздел сервера. и эти директивы внутри раздела местоположения конфигурации nginx
send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
client_max_body_size 600;
fastcgi_buffers 8 128k;
fastcgi_buffer_size 128k;
Но я все еще сталкиваюсь с ошибкой истечения времени ожидания в браузере!
(И да! Я перезапускал php-fpm и nginx тысячи раз)
Ребята, у вас есть идеи?
Пожалуйста, не воспринимайте мой ответ как оскорбление, но вы убедились, что ваш веб-сервер включен, и вы пытались получить доступ к другой странице сайта?
Увидев этот ответ, Я склонен полагать, что ситуация выглядит следующим образом: nginx пытается заполнить свой буфер FastCGI (который включен по умолчанию), в то время как вашему сценарию требуется слишком много времени, чтобы вернуть первый байт, что приводит к тайм-ауту. При условии, что я прав, есть две вещи, которые вам нужно сделать, чтобы решить эту проблему:
fastcgi_buffering
в off
изменить свой сценарий так, чтобы flush()
а также ob_flush()
Вызваны после каждой итерации:
while( $cur < 31 ) {
++$cur;
echo "\n ---- $cur ------ \n";
flush();
ob_flush();
sleep(1);
}
НТН
Я считаю, что вам нужно включить proxy_read_timeout
директива в вашем конфигурационном файле Nginx. Мой собственный файл конфигурации выглядит так:
server {
proxy_read_timeout 300s;
...
}
Вы заметите, что это в моем блоке сервера, однако эта директива также действует внутри блоков http и location.
* Изменить, чтобы добавить, что это потому, что Nginx прокси запросы к серверу PHP-FPM; директивы, которые вы пытались использовать, действительны только для контента, который обслуживается самим Nginx, и не быть прокси