Я запускаю Apache в Linux в VMWare.
Одна из запрашиваемых страниц PHP выполняет sleep(), и я обнаружил, что если я попытаюсь запросить вторую страницу, в то время как первая страница - sleep()'ing, вторая страница зависнет, ожидая завершения работы sleep() с первой страницы.
Кто-нибудь еще видел такое поведение?
Я знаю, что PHP - это не многопоточный, но это похоже на грубое неправильное обращение с процессором.
Редактировать: Я должен был упомянуть, что загрузка ЦП не увеличивается. Под «перегрузкой» ЦП я подразумеваю то, что никакая другая страница PHP не может использовать ЦП, пока страница находится в режиме sleep ().






Вы действительно видите, что ЦП переходит на 100% или просто никакие другие страницы не обслуживаются? Сколько экземпляров apache вы запускаете? Все ли они останавливаются, когда вы запускаете sleep () в одном из потоков?
Функция PHP sleep (), по сути, выполняет цикл ожидания в течение n секунд. Он не освобождает память, но не должен значительно увеличивать загрузку процессора.
Это, вероятно, означает, что ваш Apache использует только 1 дочерний процесс.
Следовательно:
Дочерний процесс 1 обрабатывает запрос (в данном случае он спит, но он может выполнять реальную работу, Apache не может определить разницу), поэтому, когда приходит новый запрос, ему придется дождаться завершения первого процесса.
Решением было бы увеличить количество дочерних процессов, которые Apache может запускать (директива MaxClients, если вы используете prefork MPM), просто удалите sleep () из PHP-скрипта.
Трудно сказать, не зная точно, что происходит в вашем скрипте, но вы, вероятно, сможете избавиться от sleep ().
Вы немного приручили это понятие словом «вероятно», но я до сих пор не понимаю, как вы можете оправдать ожидание возможности удалить фрагменты кода, которые вы никогда не видели, не нарушая при этом ничего?
Мне жаль, что я не сформулировал свое замечание более четко. Я не имел в виду, что можно просто избавиться от сна, и приложение продолжит работать. Я имел в виду, что, по всей вероятности, sleep () не существует по уважительной причине, и приложение, вероятно, можно было бы переписать для работы без sleep ().
Возможно, вызываемая страница открывает сеанс, а затем не фиксирует его, в этом случае см. этот ответ для решения.
Если у вас настроен php.ini с параметром session.auto_start, установленным в 1, он откроет сеанс до того, как запустит какой-либо код, и будет держать его открытым до тех пор, пока вы явно не закроете его или страница не дойдет до конца. Кажется, что второй запрос зависнет еще до того, как он запустит первую строку кода.
В моем случае вызов session_write_close() перед началом цикла не позволил sleep заблокировать доступ к другим страницам на сервере.
Вы когда-нибудь находили для этого решение? У меня такая же проблема.