Я только что видел это в сценарии

mysql_free_result($rawdb);

Я где-то видел это в сценарии, он запускал запрос mysql и сохранял результаты в массив, сразу после добавления в массив он запускал то, что, как я предполагаю, освободило память, используемую из запроса mysql.

Я просто прошу проверить, это хорошая идея? У меня есть пара запросов mysql, которые возвращают большой результат, который сохраняется в массиве, следует ли мне запускать этот код после него?

Также в среде, ориентированной на производительность, является ли хорошей практикой отключать большие сеансы и переменные по завершении работы с ними?

1
JasonDavis 3 Авг 2009 в 03:25

6 ответов

Лучший ответ

Из руководства:

mysql_free_result() нужно только позвонил, если вы обеспокоены тем, как много памяти используется для запросов которые возвращают большие наборы результатов. Все связанная память результатов автоматически освобождается в конце выполнение скрипта.

0
karim79 2 Авг 2009 в 23:29

Я бы не стал об этом беспокоиться. Все ресурсы результатов освобождаются в конце сценария, и если у вас нет проблем с памятью при выполнении запросов с большими наборами результатов, разница будет незначительной.

Тем не менее, если бы я читал ваш код и увидел mysql_free_result, я бы точно знал, что вы не собираетесь использовать этот ресурс в дальнейшем в коде, так что это могло бы добавить немного читабельности ...

2
nickf 2 Авг 2009 в 23:29

Я думаю, что это хорошая практика, если вы добавите уровень абстракции данных, так как это делает его хорошим гражданином с обработкой памяти. Тем более, что кода PHP много нет. : - /

Проблема использования памяти была намного хуже в PHP 4, чем в 5, но это все еще может быть проблемой. Если вам необходимо постоянно увеличивать максимальный объем памяти, разрешенный для вашего сценария PHP (по умолчанию это 8 МБ, но в большинстве сред, которые я использую, это до 64 МБ), то вам, вероятно, следует подумать о том, как ваш сценарий использует и чрезмерно использует память. Использование mysql_free_result() - одна деталь в этом арсенале, но сама по себе бессмысленна. Обработка огромных наборов данных может быть выполнена с гораздо большей эффективностью памяти, если вы используете mysql_unbuffered_query() и обрабатываете каждую строку по мере ее извлечения с помощью mysql_fetch(). Я видел, как возможности сценариев для обработки данных значительно возрастают, когда их переписывают с использованием этого подхода.

2
staticsan 3 Авг 2009 в 00:05

Этот обсуждается в документации по PHP API. . В зависимости от вашего варианта использования (т. Е. Размера получаемых результатов) mysql_free_result() может улучшить или снизить производительность. Как говорит комментатор внизу этой ссылки, позвоните memory_get_usage(), чтобы узнать, следует ли вам освобождать результат или нет. Ничто не сравнится с фактическим изучением использования ваших ресурсов.

1
Meredith L. Patterson 2 Авг 2009 в 23:31

Также в среде, ориентированной на производительность, является ли хорошей практикой отключать большие сеансы и переменные по завершении работы с ними?

Обратите внимание: если вы отключите переменные из $_SESSION, вы фактически удалите их из сеанса: их не будет, когда пользователь в следующий раз вызовет страницу вашего веб-сайта.

Так что вы можете быть осторожны с этой идеей: удаляйте данные из $_SESSION только тогда, когда они вам больше не нужны.

О unset данных и / или использовании таких функций, как mysql_free_result: учитывая, что ваши скрипты (я полагаю, поскольку PHP предназначен для веб-разработки, и пользователи не будут ждать часами загрузки страниц ) работает всего несколько сотен миллисекунд, освобождение памяти таким способом, вероятно, будет излишним: до тех пор, пока вы не получите ошибок, связанных с memory_limit, вам, вероятно, не стоит беспокоиться.

1
Pascal MARTIN 3 Авг 2009 в 04:30

Страница руководства PHP для функции отвечает на большинство ваших вопросов:

http://us.php.net/manual/en/function.mysql-free-result.php

0
Amber 2 Авг 2009 в 23:29