PHP: обнаружение и отображение сообщения «Сервер перегружен» - PullRequest
3 голосов
/ 15 марта 2012

Я заметил, что некоторые сайты, такие как hypem.com , показывают сообщение об ошибке «Вас не обслужили», когда сайт занят, вместо того, чтобы просто дать людям подождать, перевести время или обновить;усугубляет проблему загрузки сервера.

Мы слишком загружены, чтобы обработать ваш запрос.Пожалуйста, нажмите «назад» в вашем браузере и попробуйте, что вы делали снова.

Как это достигается до того, как сервер перегружается?Это звучит как очень удобный способ управления ожиданиями пользователей, если сайт перегружен, а также дает время для восстановления.

Ответы [ 6 ]

2 голосов
/ 15 марта 2012

Другие варианты это:

$load = sys_getloadavg();
if ($load[0] > 80) {
    header('HTTP/1.1 503 Too busy, try again later');
    die('Server too busy. Please try again later.');
}

Я получил его с сайта php http://php.net/sys_getloadavg, хотя я не уверен, какие значения означают, что sys_getloadavg возвращает

2 голосов
/ 15 марта 2012

Вы можете просто создать файл 500.html и заставить свой веб-сервер использовать его при возникновении ошибки 50x.

т.е. в вашем конфиге apache:

ErrorDocument 500 /errors/500.html

Или используйте функцию php shutdown , чтобы проверить, достигнут ли тайм-аут запроса (который по умолчанию равен 30 с), и, если это так, - перенаправить / отрендерить что-то статическое (чтобы сама ошибка не вызывала проблем) .

Обратите внимание, что большинство сайтов, на которых вы видите сообщение "Этот сайт слишком долго отвечает", эффективно генерируют это сообщение с помощью JavaScript.

1 голос
/ 15 марта 2012

Это не строго PHP-решение, но вы могли бы сделать как Twitter, т.е.

  • обслуживает в основном статические приложения HTML и Javascript с CDN или другого вашего сервера
  • вызовы действительно тяжелых функций серверной стороны (PHP в вашем случае) фактически выполняются в AJAX из одного из ваших статических файлов JS
  • , чтобы вы могли установить тайм-аут для ваших вызовов AJAX и возвращать сообщение "Похоже, загрузка твитов может занять больше времени, чем ожидалось".
1 голос
/ 15 марта 2012

Вы также можете ограничить максимальное соединение в конфигурации apache ...

См.

http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients

http://www.howtoforge.com/configuring_apache_for_maximum_performance

1 голос
/ 15 марта 2012

Это может быть связано с тайм-аутом соединения с базой данных, но это предполагает, что ваш сервер имеет большую нагрузку на базу данных, чем нагрузку на процессор, в трудные времена.В этом случае вы можете сделать так, чтобы ваш коннектор БД отображал сообщение, если в течение 1 секунды не происходит никакого соединения.

Вы также можете использовать быстрый запрос к таблице журналов, чтобы выяснить, сколько попаданий в секунду.и автоматически не отвечать больше после определенного момента, чтобы сохранить QOS для других.В этом случае вам придется установить этот уровень вручную, основываясь на журналах сервера.Альтернативный метод можно увидеть здесь в модуле газа Drupal.

Другой альтернативой будет использование страницы состояния Apache для получения информации о том, сколько дочерних процессов свободно, и для определения там идентификатора.не осталось ни одного согласно ответу @ giltotherescue на этот вопрос .

1 голос
/ 15 марта 2012

Вы можете использовать функцию php tick, чтобы определить, когда сервер не загружается в течение определенного периода времени, а затем отобразить сообщения об ошибках.Основное использование:

<?php 
$connection  = false; 
function checkConnection( $connectionWaitingTime = 3 ) 
{ 
    // check connection & time 
    global $time,$connection; 
    if( ($t = (time() - $time)) >= $connectionWaitingTime && !$connection){  
        echo ("<p> Server not responding  for <strong>$t</strong> seconds !! </p>"); 
        die("Connection aborted");             
    } 
} 

register_tick_function("checkConnection"); 
$time = time(); 
declare (ticks=1) 
{ 
   require 'yourapp.php' // load your main app logic
    $connection = true ; 
}

while (true) просто для имитации загруженного сервера.Чтобы внедрить сценарий на своем сайте, вам нужно удалить оператор while и добавить логическое событие страницы EG, событие диспетчеризации или действия фронт-контроллера и т. Д.

И $ connectionWaitingTime в функции checkCOnnection устанавливается на таймаут через 3 секунды, но вы можете изменить это на то, что вы хотите

...