Как ограничить в ресурсах выполнение отдельного файла PHP?
Здравствуйте! Возник такой вопрос, возможно ли ограничить файл php в ресурсах? Чтобы было понятно, приведу пример. Заодно, возможно кто то подскажет другие варианты подхода к решению.
Есть допустим два скрипта PHP. Оба часто выполняются, однако первый более приоритетный, а второй менее. И идеально, чтобы второй скрипт выполнялся медленнее из-за ограничений в ресурсах, чтобы первый выполнялся быстро и свободные ресурсы сервера он использовал без проблем.
Допустим скрипт выполняет какую то деятельность, после которой клиент получает результат. Есть клиенты премиум, а есть использующие сервис бесплатно. И например нужно сделать так, чтобы премиум клиенты используя скрипт имели быстрое выполнение, а бесплатники ожидали бы дольше (возможно даже была некая очередь)
Буду благодарен за любые ответы, советы или подсказку!
Приоритет в очереди
Одна очередь - один (или несколько потоков).
Как в очередь (или в менеджер потоков) поступает задача - на основе типа клиента задаче выставляется приоритет и она ставится или в конец общей очереди (для обычных), или в конец приоритетной очереди (для платных).
Очередь выглядит так: [исполнение задачи/exec] <- [платные] <- [бесплатные]
При желании, можно сделать в платной очереди, что каждый N-ый (N>2) клиент - бесплатный. (чтобы как-то уравновесить распределение времени CPU)
Сергей, если долго выполняются задачи - можно хранить в БД.
Обслуживание очереди делается через CRON (и берётся сразу пакет заданий) или через консольный запуск PHP-скрипта, который в бесконечном цикле опрашивает БД или принимает запросы (задачи) по сокету от другого скрипта.
Могу вам подсказать костыль :)
Для того чтобы скрипты пользователей с "бесплатным" тарифом работали визуально медленнее сделайте задержку :). sleep(2) и т.д.
Повторюсь это грубое и костыльное решение, но пользователи заметят что у них работает медленнее чем у тех кто платит бабосики.
А если sleep() поставить в какой-либо цикл :), то будет вообще фантастика :). Главное не переусердствуйте.
В sleep() можете передавить переменную с временем задержки, а для платников это будет 0
А для работы с потоками, вам необходимо юзать спец библиотеки, также зависит от версии/сборки РНР (и от веб сервера). По сути РНР - работает лишь с одним процессом в один момент времени.
Евгений Прозоров, хах) я знаю про слип, но это уже слишком)) суть только в том, чтобы бесплатники не тратили ресурсы сервера, из-за чего платники будут дольше ждать дольше.
Я вообще думаю, что всё таки как ни крути, нужен будет какой нибудь демон, который все эти очереди будет вести. А вот сам процесс вычисления выполнять вообще на nodejs, как я понял у него нет проблем с долго выполняющимся сценарием или я не прав?