sleep () молча загружает процессор - PullRequest
15 голосов
/ 22 августа 2008

Я использую Apache под Linux в VMWare.

Одна из страниц PHP, которую я запрашиваю, выполняет sleep(), и я обнаружил, что если я попытаюсь запросить вторую страницу, в то время как первая страница - sleep()'ing, вторая страница зависнет, ожидая sleep() с первой страницы до конца.

Кто-нибудь еще видел такое поведение?

Я знаю, что PHP не многопоточный , но это похоже на грубое неправильное обращение с процессором.

Редактировать : Я должен был упомянуть, что загрузка процессора не увеличивается. Под "зависанием" процессора я подразумеваю, что никакая другая страница PHP не может использовать процессор, пока страница находится в состоянии сна ().

Ответы [ 3 ]

11 голосов
/ 31 января 2009

Возможно, вызванная страница открывает сеанс, а затем не фиксирует его, в этом случае см. этот ответ для решения.

4 голосов
/ 22 августа 2008

Это, вероятно, означает, что ваш Apache использует только 1 дочерний процесс.

Следовательно:

1 дочерний процесс обрабатывает запрос (в этом случае он спит, но может выполнять реальную работу, Apache не может определить разницу), поэтому, когда приходит новый запрос, ему придется ждать до первого процесса сделано.

Решение состоит в том, чтобы увеличить число дочерних процессов, которые разрешено порождать Apache (директива MaxClients , если вы используете prefork MPM), просто удалите sleep () из сценария PHP.

Трудно сказать, точно не зная, что происходит в вашем сценарии, но вы, вероятно, можете избавиться от сна ().

1 голос
/ 22 августа 2008

Вы на самом деле видите, что процессор уходит на 100% или просто другие страницы не обслуживаются? Сколько Apache-экземпляров вы работаете? Все ли они останавливаются при запуске sleep () из потоков?

Функция PHP sleep () по существу проходит через цикл ожидания в течение n секунд. Он не освобождает память, но не должен значительно увеличивать нагрузку на процессор.

...