2014-02-03 3 views
0

Когда я запускаю этот скрипт, апач использует всю доступную память, а сервер перестает отвечать на запросы:MySQL цикл запроса в PHP

$db = new mysql(); 
$result = $db->query($sql); 
while($row = $db->query($sql)) ... 

Почему предел PHP не ограничивает апачский процесс? PHP работает как mod_php с apache itk.

У меня установлен предел PHP в php.ini, и я вижу этот предел в phpinfo(). Я не задал никаких ограничений в PHP-скрипте.

+2

Я думаю, он понимает ошибку, которую он совершил (он описал ее как несчастный случай в первой строке). Его вопрос состоял в том, почему сервер никогда не убивал скрипт, потому что он был в цикле. Возможно, этот вопрос будет лучше задан на сайте администрирования сервера, например. serverfault.com. – Barmar

+0

Ну ... у OP уже есть доступ к ресурсу запроса, поэтому он должен перебираться. Похоже, что кто-то не слишком сильно пытается – leon

ответ

1

Как вы уже знаете, 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. Подобное поведение с ошибкой - одна из веских причин. Удачи!

+0

Возможно, мой английский плохой, но я повторюсь. Я знаю, почему код не работает, я знаю, как его решить. Я спрашиваю о лимитах php. Почему в этом случае предел php не работает. – user134880

+0

Сначала я неправильно понял ваш вопрос; Я отредактировал свой ответ, чтобы узнать, почему PHP игнорирует ограничение памяти. –

+0

Таким образом, проблема заключается в том, что «не присваивание результата переменной»? Это ошибка php? Похоже, это так. Таким образом, в этой ситуации пользователь может избежать ограничений по php и удалить сервер. – user134880

Смежные вопросы