Оставляет ли PHP proc_nice потоки Apache с новым приоритетом?
Вопрос
Действительно ли при выполнении proc_nice() приятно работать с потоком Apache?
Если да, и если текущий пользователь (не суперпользователь) не может восстановить свой первоначальный приоритет, уничтожает соответствующий поток Apache (apache_child_terminate) на сервере Apache 2.0x?
Проблема в том, что я пытаюсь ограничить влияние приложения, которое позволяет пользователю запускать запросы Ad-Hack.Запросы могут быть огромными, и результирующее преобразование данных требует много памяти и процессора.
Я уже переписал процесс, чтобы он был более потоковым, что помогает с потреблением памяти, но мне также хотелось бы, чтобы процесс выполнялся с более низким приоритетом.Однако я не могу оставить поток Apache с низким приоритетом, поскольку на этом же компьютере работает множество высокоприоритетных веб-сервисов.
ТИА
Решение
В такой ситуации решением может быть не выполнять такую тяжелую работу в процессах Apache, а либо:
- запустите внешний процесс PHP, используя что-то вроде
shell_exec
, например - это если вам нужно работать в синхронном режиме (т.е. если вы не можете выполнить задачу через пару минут) - отправить задачу в систему FIFO и немедленно вернуть пользователю сообщение о том, что «ваша задача скоро будет обработана»
- и есть какой-то другой процесс (например, запускается через crontab каждую минуту) проверьте эту очередь FIFO
- и обработайте, в очереди что-то есть
- Этот процесс сам по себе может работать в режиме низкого приоритета.
Как можно чаще, особенно если тяжелые вычисления занимают некоторое время, я бы выбрал второе решение:
- Это позволяет пользователям немедленно получить обратную связь:«сервер получил ваш запрос и скоро обработает его»
- Это не позволяет процессам Apache «работать» долго:тяжелые вещи выполняются другими процессами
- Если однажды вам понадобится такое количество вычислительной мощности, что одного сервера будет недостаточно, такую систему будет легче масштабировать:просто добавьте второй сервер, который будет выбирать из той же очереди FIFO
- Если ваш сервер действительно слишком загружен, вы можете остановить обработку из очереди, по крайней мере, на некоторое время, чтобы нагрузка могла улучшиться - например, это может быть полезно, если ваши критически важные веб-сервисы часто используются в конкретном временные рамки.
Другой (красиво, но я еще не пробовала) решением было бы использовать какой-то инструмент, например, Шестерен :
Gearman предоставляет общую структуру применения для работы с работой для других машин или процессов, которые лучше подходят для выполнения работы.
Это позволяет вам работать параллельно, загружать обработку баланса и вызывать функции между языками.
Его можно использовать в различных приложениях, от веб-сайтов с высокой доступностью до транспортировки событий репликации базы данных.
Другими словами, это нервная система того, как распределенная обработка общается.