sleep () молча загружает процессор

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

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

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

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

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

21.08.2008 23:17:41
Вы когда-нибудь находили решение для этого? У меня та же проблема.
Martin Konecny 23.05.2010 17:26:30
3 ОТВЕТА

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

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

1
21.08.2008 23:20:26

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

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

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

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

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

4
22.08.2008 14:01:07
Вы немного укротили это понятие словом «вероятно», но я до сих пор не понимаю, как вы можете оправдать ожидание того, что сможете удалить фрагменты кода, которые вы никогда не видели, не нарушая ничего?
JoeBloggs 17.12.2008 15:25:51
Мне жаль, что я не произнесла свое замечание более четко. Я не имел в виду, что вы могли бы просто избавиться от сна, и приложение продолжит работать. Я имел в виду, что, по всей вероятности, функция sleep () отсутствует по уважительной причине, и приложение, вероятно, можно было бы переписать для работы без sleep ().
rix0rrr 22.12.2008 12:51:12

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

11
23.05.2017 12:08:58
Если у вас настроен php.ini с параметром session.auto_start, равным 1, он откроет сеанс до того, как выполнит какой-либо код, и будет держать его открытым до тех пор, пока вы не закроете его явно, или страница не достигнет конца. Второй запрос, по-видимому, зависнет даже до запуска первой строки кода.
Joeri Sebrechts 25.07.2010 18:47:52
В моем случае вызов session_write_close()перед началом цикла не позволил sleepзаблокировать доступ к другим страницам на сервере.
thirdender 10.04.2014 05:49:40