Информация о загрузке процессора на PHP на примере IPB

Информация о загрузке процессора на PHP на примере IPBПрактически на любом хостинге такие скрипты, как IPB не могут получить информацию о текущей загрузке процессора, поскольку хостеры отключают некоторые функции в php и ограничивают Вас своей домашней директорией (а если нет, то задумайтесь о смене хостинга). Из-за этого становится невозможным использование функции, отключающей форум например во время DDoS атаки.
Стандартная функция в IPB пытается получить информацию из файла /proc/loadavg, но поскольку у нас нет доступа к нему, то можно пойти другим путем и воспользоваться стандартной функцией в PHP, которая была добавлена в версии 5.1.3.

Чтобы форум показывал данную информацию, нужно проделать несколько несложных операций.

Открываем файл ./admin/sources/base/core.php
Ищем:
        if( !$server_load_found )
        {
            # @ supressor stops warning in > 4.3.2 with open_basedir restrictions
И после вставляем:
            $data =  sys_getloadavg();
            $load_limit = $data[0];

Затем ищем:
if ( @file_exists('/proc/loadavg') )
и заменяем на
if (!$load_limit && @file_exists('/proc/loadavg') )

Теперь информацию и загрузке процессора форум будет получать при помощи функции sys_getloadavg

Если Вы хотите, чтобы на форуме всегда отображалась информация о текущей загрузке процессора не зависимо от того установлено ли ограничение в админцентре или нет тогда проделайте следующее:
Откройте файл ./admin/sources/base/ipsRegistry.php и найдите в нем:
            /* Check server load */
            if ( ipsRegistry::$settings['load_limit'] > 0 )
            {
                $server_load    = IPSDebug::getServerLoad();

                if ( $server_load )
                {
                    $loadinfo = explode( "-", $server_load );

                    if ( count($loadinfo) )
                    {
                        self::$server_load = $loadinfo[0];

                        if ( self::$server_load > ipsRegistry::$settings['load_limit'] )
                        {
                            self::instance()->getClass('output')->showError( 'server_too_busy', 2001 );
                        }
                    }
                }
            }
и замените этот код на следующий:
            /* Check server load */
            if ( ipsRegistry::$settings['show_load_limit'] > 0 || ipsRegistry::$settings['load_limit'] > 0 ) {
                $server_load    = IPSDebug::getServerLoad();

                if ( $server_load )
                {
                    $loadinfo = explode( "-", $server_load );

                    if ( count($loadinfo) )
                    {
                        if ( ipsRegistry::$settings['show_load_limit'] > 0 )
                        {
                            self::$server_load = $loadinfo[0];
                        }

                        if ( ipsRegistry::$settings['load_limit'] > 0 && self::$server_load > ipsRegistry::$settings['load_limit'] )
                        {
                            self::instance()->getClass('output')->showError( 'server_too_busy', 2001 );
                        }
                    }
                }
            }


Затем заходите в админцентр, Tools & Settings -> System Settings -> System -> CPU Saving & Optimization (Настройки, Системные настрйоки, Система, CPU и оптимизация) и добавьте новый пункт в настройках:
Setting title: Показывать загрузку ЦП?
Setting Position: 0
Setting Description: Показывать загрузку ЦП на форуме или нет
Setting Group: CPU Saving & Optimization
Setting Type: Yes/No Radio Buttons
Setting Key: show_load_limit
Setting Default Value: 1
Остальные поля оставляем пустыми.

Теперь на вашем форуме будет отображаться информация о загрузке CPU:
Информация о загрузке процессора на PHP на примере IPB

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

Функция sys_getloadavg выводит среднюю информацию о загрузке процессора (количество процессов в очереди) за последние 1, 5 и 15 минут.
Вот пример для использования функции на других движках или скриптах:
$data =  sys_getloadavg();
echo $data[0]; // 0.04
echo $data[0].' '.$data[1].''.$data[2] // 0.04 0.15 0.22

Теги: Load average, sys_getloadavg, IPB, CPU

Добавление комментария

Код: Включите эту картинку для отображения кода безопасности
обновить, если не виден код
Введите код