Sleep () незаметно загружает процессор

Я запускаю Apache в Linux в VMWare.

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

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

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

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

Вы когда-нибудь находили для этого решение? У меня такая же проблема.

Martin Konecny 23.05.2010 21:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
15
1
6 497
3

Ответы 3

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

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

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

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

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

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

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

Вы немного приручили это понятие словом «вероятно», но я до сих пор не понимаю, как вы можете оправдать ожидание возможности удалить фрагменты кода, которые вы никогда не видели, не нарушая при этом ничего?

JoeBloggs 17.12.2008 18:25

Мне жаль, что я не сформулировал свое замечание более четко. Я не имел в виду, что можно просто избавиться от сна, и приложение продолжит работать. Я имел в виду, что, по всей вероятности, sleep () не существует по уважительной причине, и приложение, вероятно, можно было бы переписать для работы без sleep ().

rix0rrr 22.12.2008 15:51

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

Если у вас настроен php.ini с параметром session.auto_start, установленным в 1, он откроет сеанс до того, как запустит какой-либо код, и будет держать его открытым до тех пор, пока вы явно не закроете его или страница не дойдет до конца. Кажется, что второй запрос зависнет еще до того, как он запустит первую строку кода.

Joeri Sebrechts 25.07.2010 22:47

В моем случае вызов session_write_close() перед началом цикла не позволил sleep заблокировать доступ к другим страницам на сервере.

thirdender 10.04.2014 09:49

Другие вопросы по теме