Как вы уже знаете, while($row = $db->query($sql))
вызывает бесконечный цикл; он просто запускает запрос снова и снова, пока сервер не умрет или не уничтожит этот процесс. Вы должны сделать while($row = $result->fetch())
или while($row = $result->fetch_assoc(...))
.
Также, пожалуйста, don't use mysql_*
; функции mysql_*
устарели, deprecated и небезопасны. Вместо этого используйте MySQLi
или PDO
.
Редактировать: Сначала я не понял ваш вопрос. Вот проблема: mod_php работает в Apache, то есть он запрашивает память через процесс Apache. Таким образом, память, требуемая $db->query()
, используется Apache, а не отдельный процесс mod_php. Известны некоторые проблемы памяти с функциями mysql_ *. Например, как описано here, mysql_query()
буферизует все данные из запроса. mod_php, по-видимому, не отслеживает его, однако, поскольку вы никогда не назначаете эти данные для переменных PHP. Таким образом, объем памяти Apache продолжает расти, но mod_php этого не понимает, поэтому предел памяти php.ini никогда не срабатывает.
Как я сказал выше, вам следует избегать функций mysql_ * и класса MySQL и использовать либо MySQLi или PDO. Подобное поведение с ошибкой - одна из веских причин. Удачи!
Я думаю, он понимает ошибку, которую он совершил (он описал ее как несчастный случай в первой строке). Его вопрос состоял в том, почему сервер никогда не убивал скрипт, потому что он был в цикле. Возможно, этот вопрос будет лучше задан на сайте администрирования сервера, например. serverfault.com. – Barmar
Ну ... у OP уже есть доступ к ресурсу запроса, поэтому он должен перебираться. Похоже, что кто-то не слишком сильно пытается – leon