Ответ 1
Возможно, вызываемая страница открывает сеанс, а затем не фиксирует его, в этом случае см. этот ответ для решения.
Я запускаю Apache для Linux в VMWare.
Одна из страниц PHP, которые я запрашиваю, имеет sleep()
, и я нахожу, что если я попытаюсь запросить вторую страницу, а первая страница sleep()'ing
, вторая страница зависает, ожидая sleep()
от первой страницы до конца.
Кто-нибудь еще видел это поведение?
Я знаю, что PHP не многопоточное, но это похоже на грубое неправильное обращение CPU.
Изменить. Я должен был упомянуть, что использование ЦП не всплескивается. То, что я подразумеваю под "зависанием" процессора, заключается в том, что никакая другая страница PHP, похоже, не может использовать процессор, пока страница находится в режиме сна().
Возможно, вызываемая страница открывает сеанс, а затем не фиксирует его, в этом случае см. этот ответ для решения.
Что это, вероятно, означает, что ваш Apache использует только один дочерний процесс.
Следовательно:
1 дочерний процесс обрабатывает запрос (в этом случае спать, но он может выполнять реальную работу, Apache не может сказать разницы), поэтому, когда приходит новый запрос, ему придется подождать до первого процесса делается.
Решение состоит в том, чтобы увеличить количество дочерних процессов, которые Apache разрешает создавать (MaxClients, если вы используете prefork MPM), просто удалите sleep() из PHP скрипт.
Не зная, что происходит в вашем script, трудно сказать, но вы, вероятно, можете избавиться от sleep().
Действительно ли вы видите, что процессор переходит на 100% или просто нет других страниц? Сколько apache-экземпляров вы запускаете? Все ли они останавливаются при запуске sleep() в потоках?
Функция PHP sleep() по существу проходит через незанятый цикл в течение n секунд. Он не освобождает память, но не должен значительно увеличивать нагрузку на ЦП.