Ответ 1
Использование памяти - 635384 байта перед вызовом запроса. Я предполагаю, что запрос выделяется в кусках для каждой записи.
Ding ding ding!
При подключении к MySQL PHP любит использовать буферизованные запросы. Это верно независимо от того, какой метод вы используете для подключения. При использовании буферизованных запросов весь набор результатов извлекается немедленно, а не при получении, когда вы спрашиваете. Это обычно хорошо для производительности, так как меньше круговых поездок.
Но, как и все в PHP, там есть. Как отмечено на странице буферизации:
При использовании libmysql в качестве библиотеки Предел памяти PHP не будет считать память, используемую для наборов результатов, если данные не будут загружены в переменные PHP. С mysqlnd учетная запись будет включать полный набор результатов.
Вы используете PHP 5.3, а это означает, что есть хороший шанс, что вы используете mysqlnd.
Здесь вы захотите отключить буферизованные запросы. Это было сделано по-разному в каждом интерфейсе PHP для MySQL:
- Для PDO вам нужно установить атрибут
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
вfalse
. - Для mysqli вам необходимо передать константу
MYSQLI_USE_RESULT
в методquery
. - Для mysql вам нужно вызвать
mysql_unbuffered_query
вместоmysql_query
.
Подробные сведения и примеры приведены на странице.
Большой небуферизованный запрос запроса!
Вы должны правильно закрыть дескриптор оператора и освободить набор результатов перед выдачей другого запроса:
- В PDO это означает вызов
closeCursor
в дескрипторе инструкции. - В mysqli это означает вызов
free_result
в дескрипторе инструкции илиfree
в дескрипторе результата, в зависимости от того, с чем вы работаете. - В mysql это означает вызов
mysql_free_result
Невыполнение этого условия приведет к ошибке.