Ограничение ресурсов сервера в PHP

327
11 января 2017, 04:07

Здравствуйте, господа.

Есть небольшое приложение, и проблема в ресурсозатратности. Дело в том, что если его будут использовать более, чем n человек одновременно - оно будет некорректно работать, в связи с этим появился вопрос: как контролировать расход ресурсов с помощью PHP, а не настроек сервера?

К примеру, чтобы можно было тратить n ресурсов. На данный момент вижу лишь следующий вариант:

При старте работы приложения в конфигурационный файл записывать +1, и в конце работы -1. И при достижении, допустим, 10 запусков одновременно пользователю не давать запустить приложения, сообщая об очереди.

Answer 1

Например, у вас есть демон, который отсылает огромное количество запросов на какие-то внешние ресурсы и записывает результаты в базу. Предположим, работа такого демона длится от 1 минуты до 20 минут. А вызывается он в кроне каждую минуту. Как сделать так чтобы в один момент времени работал только один демон ?

Чтобы не возникало таких ситуаций, когда одно и тоже сообщение отправляется по несколько раз, нужно хранить где-то состояние демона, запущен ли он в данный момент времени или нет (в бд, в файлах). Каждый раз перед запуском демона нужно проверять, запущен ли он, если да, то не запускать.

Теперь частности.

Если делаем через базу: то таблица demons выглядит из 3 колонок: название демона(name), кол-во запущенных демонов(runnig_count), максимальное кол-во одновременно запущенных демонов(max_count). Проверяем, если runnig_count < max_count - запускаем демон, увеличиваем max_count на 1. Демон завершился - max_count уменьшаем на 1

Если делаем через файловую систему: тут поможет функция flock. т.е. на каждый отдельный запуск демона создается свой lock файл.

class Lock
{
    private static $_LockHandle;
    public static function lockfile($lockName) {
        self::$_LockHandle = fopen('/tmp/'.$lockName.'.lock', 'w+');
        if (!flock(self::$_LockHandle, LOCK_EX | LOCK_NB)) {
            return False;
        }
        return True;
    }
    public static function unlock() {
        if(is_resource(self::$_LockHandle)) {
            fclose(self::$_LockHandle);
        }
    }
}

Ну и логика работы по такой же схеме как и с базой

$lockName = 'DemonName';
$max = 10;
$demonCounter = 0;
$isDemonExecute = False;
while ($demonCounter < $max) {
    $lockFileName = $lockName.$demonCounter;
    if (Lock::lockfile($lockFileName)) {
        // Делаем что нужно
        Lock::unlock($lockFileName)
        $isDemonExecute = True;
        break;
    }
    $demonCounter++;
}
if ($isDemonExecute) {
    // Сообщение о успешной работе
} else {
    // Сообщение о нагрузке, попробуйте позже
}
READ ALSO
Как добавить вторую переменную

Как добавить вторую переменную

С массивом $array все работает верно, добавляется определенное количество строк и заносится в каждую строку ячейка со значением $array = $_POST[form_text_o];...

401
Вопрос по for и break

Вопрос по for и break

Если писать так:

350
Выборка из MySQL без повторений хотя бы одного значения

Выборка из MySQL без повторений хотя бы одного значения

Доброго времени суток, друзьяЕсть необходимость вывести из БД значения из определенного столбика

400
Как в php строку умножить на число?

Как в php строку умножить на число?

К примеру хочу строку "aaa" умножить на число 3, чтобы было "aaaaaaaaa"

525