Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122

Закрытие БД и очистка результата

30.07.2010, 19:44. Показов 5817. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
меня интересует mysql_free_result() и mysql_close() , я в курсе что первое освобождает память от результатов а второе закрывает БД , но я ими не пользуюсь так как работает БД и так нормально и никаких лагов или ошибок не наблюдалось , вопрос в том что от них будет правельнее работать или быстрее?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2010, 19:44
Ответы с готовыми решениями:

Очистка консоли, очистка строки, установка курсора
Здравствуйте! Подскажите как можно после очистки консоли поставить курсор в самый вверх, чтоб то что вывожу было в верху консоли а...

Закрытие дочернего окна вызывает закрытие программы
Здравствуйте! Не могу никак разобраться, как сделать так, чтобы дочернее окно при его закрытии не закрывало всю программу. Я читал похожие...

Очистка графика + очистка формы
Есть две программы: Прямо на форме (через Canvas) рисую правильный многоугольник, но после нужно очистить форму чтоб не...

11
 Аватар для GalaX
701 / 573 / 59
Регистрация: 18.11.2008
Сообщений: 2,147
30.07.2010, 20:59
вообще, mysql_close() можно и не делать вообще, т.к. по окончании скрипта все коннекты итак закрываются, но все таки я его юзаю
а что касается free, то я обычно использую когда работа идет с несколькими резльтатами.. т.е. сделал несколько запросов - получил несколько резалтов, поработал с ними.. ну а потом нафиг они нужны если память не помешает для другого - вот и очищаем их...
ну чето типа этого
1
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
30.07.2010, 21:08
Цитата Сообщение от Nebiros Посмотреть сообщение
вопрос в том что от них будет правельнее работать или быстрее?
Нет. После завершения скрипта память и так освобождается, а подключения закрываются. Я не знаю случаев, для которых эти функции могут понадобиться.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
30.07.2010, 21:21  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
Нет. После завершения скрипта память и так освобождается, а подключения закрываются. Я не знаю случаев, для которых эти функции могут понадобиться.
тоесть будут они или не будут от этого ничего не меняется?
тогда смешной вопрос зачем они вообще нужны?
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
30.07.2010, 21:29
Цитата Сообщение от Nebiros Посмотреть сообщение
тоесть будут они или не будут от этого ничего не меняется?
Можешь освободить память во время работы скрипта или оно само освободиться после. Но в обычных случаях ничего не меняется. Лично я ими не пользуюсь.

Цитата Сообщение от Nebiros Посмотреть сообщение
тогда смешной вопрос зачем они вообще нужны?
Не знаю... возможно, если скрипт получает очень много значений (на столько много, что это ощутимо для свободной оперативки), а потом нужно ещё для каких-то целей отожрать оперативки... но тогда можно освободить эту память.
Но скорее всего, они просто перенесли эту функцию из списка MySQL API... просто что бы была.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
30.07.2010, 21:41  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
Не знаю... возможно, если скрипт получает очень много значений (на столько много, что это ощутимо для свободной оперативки), а потом нужно ещё для каких-то целей отожрать оперативки... но тогда можно освободить эту память.
а каким образом можно узнать сколько оперативной памяти занимает запрос, чтобы знать использовать free или нет?
0
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
31.07.2010, 16:56
Поиграйся с функцией memory_get_usage()

Добавлено через 14 часов 25 минут
И еще, вот у меня есть база несколько сот тысяч позиций, занимает она 100 Мбайт, т.е. чтобы реально забить память выделенную одному процессу PHP (по умолчанию 32 Мбайт), нужно подгрузить 100000 позиций (приблизительно). Не представляю такую ситуацию.

Часто память уходит на считывание файлов, если считывать их целиком, поэтому лучше считывать их порциями
1
 Аватар для GalaX
701 / 573 / 59
Регистрация: 18.11.2008
Сообщений: 2,147
31.07.2010, 17:50
Цитата Сообщение от arvitaly Посмотреть сообщение
Не представляю такую ситуацию.
пример:
таблица вешает 1 Мб
пхп-скрипт читает ее полностью, размер занимаемой памяти скриптом станет 1 Мб
хостер дает использовать клиенту не более 64 Мб (возьмем по минимуму)
для того чтобы хостер начал косо смотреть на клиента надо чтоб 64-65 человек одновременно обратились к этому скрипту

мораль сей басни такова, что нужно обращать внимание не только на память занимаемую скриптом, но еще и на память лимит которой устанавливает хостер

вернемся к free_result:
после
PHP
1
$result = mysql_query('SELECT * FROM таблица_размером_100Мб')
пхп скрипт не будет занимать 100Мб памяти (он лишь хранит идентификатор к результату), эту память будет занимать мускул
а вот если добавим это:
PHP
1
2
$array = array ();
while ($array[] = mysql_fetch_array($result)) {}
то теперь эти 100Мб будет занимать еще и пхп скрипт
т.е.: 100Мб в пхп-скрипте + 100Мб в мускуле (т.к. мы не сделали free) = 200 Мб итого

зы: у любого хостера инфаркт случится если он увидит каким образом скрипты насилуют память их серверов
зыы: все подсчеты естественно грубые, просто для примера
0
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
31.07.2010, 18:03
Все рассуждения верны, НО

1. Если к вашему сайту идет обращение 64-65 человек одновременно (даже если возьмем в минуту), то это около 100000 посетителей в день. С такой посещаемостью давно в пору думать уже о выделенном сервере, если не о нескольких. И уж никак не хостинг с 64 Мбайтами оперативы

2. Еще раз повторю, что не представляю ситуацию в которой нужно считать и полностью занести в память процесса PHP 100Мбайт информации, хоть из одной таблицы, хоть из нескольких. Это мегакривой код.

Кстати, приведу именно такой случай: сайт, на сайте есть рубрики, рубрик около 1000 у каждой рубрики в поле с типом TEXT описание и еще туева хуча полей.
В одном месте там выбирались все подгруппы одной группы.
Какой то быдлокодер вместо того, чтобы сделать элементарный запрос
SQL
1
WHERE parent_id=...
, действительно делает
SQL
1
SELECT * FROM groups
, потом засовывает весь результат в массив на PHP и после этого уже делает фильтр. В итоге: висит весь сервак (а он дедик с 2 гигами оперативы).

Вывод: не нужно писать лишь бы работало, нужно думать над каждой строчкой и понимать, что происходит.

Кстати, интересный момент
пхп скрипт не будет занимать 100Мб памяти (он лишь хранит идентификатор к результату), эту память будет занимать мускул
Проведите тест:

PHP
1
2
3
4
$result=mysql_query("select * from table1");
sleep(60);
$row=mysql_fetch_row($result);
echo $row[0];
А за 60 секунд отключите Mysql - сервер, результат вы получите, полагаю что в $result хранится указатель на область памяти в которой хранится результат, но могу ошибаться
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
31.07.2010, 18:13
Лучший ответ Сообщение было отмечено как решение

Решение

Теоритические разъяснения о буферизованных и небуферизованных запросах
Существуют два способа для выполнения запросов с результатом: буферизованный и небуферизованный.

В Небуферизованном запросе результат не буферизуется, поэтому:
  • Экономится память, ибо записи выдаются клиенту напрямую;
  • Рельное получение записей выполняется только когда клиент делает mysql_fetch_row(), и запись сразу отдается клиенту;
  • Можно прочитать данные из результата только последовательно и только один раз;
  • Нельзя узнать количество записей в результате;
  • Нельзя сделать следующий запрос или прервать получение результата, пока не прочитаны все записи. (Если, все-таки, прервать получение результата до получения всех записей, остальные записи окажутся в результате следующего запроса);
  • Вызывать mysql_free_result() надо обязательно и только после получения всех записей.

В Буферизованном запросе весь результат буферизуется (временная таблица или т.п.), поэтому:
  • Съедается Nное количество ресурсов для временного хранения всего результата;
  • Клиент может начать работу с результатом только после того, как сервер извлечет и буферизует все записи;
  • Можно читать данные любое количество раз с возможностью навигации по записям;
  • Известно количество записей в результате;
  • Можно выполнять следующие запросы сразу после окончания буферизации;
  • Не обязательно считывать все записи.
  • Буфер будет жить до завршение соединения или до его принудительного освобождения с помощью mysql_free_result().


Для выполнения небуферизованного запроса в PHP используется mysql_unbuffered_query() [в MySQL C API mysql_real_query()]. Если Вы используете такой способ, то обязательно должны считывать из результата все записи и обязательно должны вызывать mysql_free_result() перед тем, как сделать следующий запрос.

Для выполнения буферизованного запросы используется mysql_query(). Да, можно не вызывать mysql_free_result(), НО после каждого запроса сервер тратит ресурсы на буферизацию результата. До тех пор, пока соединение с клиентом установлено, сервер не станет сам избавляться от этих результатов. Таким образом, если клиент вообще не использует mysql_free_result(), то все результаты накапливаются, захламляют ресурсы сервера и способствуют снижению производительности.

Вызывать mysql_free_result() для освобождения результата не так уж и трудно.
5
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
31.07.2010, 18:15
А можно ссылку на источник?
1
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
31.07.2010, 18:25
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от arvitaly Посмотреть сообщение
А можно ссылку на источник?
MySQL C API mysql_use_result(), mysql_store_result()
PHP mysql_unbuffered_query()
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2010, 18:25
Помогаю со студенческими работами здесь

В чем ошибка при выводе двух целых чисел,нахождения результата их деления и выводом результата на экран?
решил вывести с клавиатуры два целых числа,написал программу как написано в учебнике Фаронова В.В. нажимаю ctrl+f9 и в итоге получаю...

Вызов модальной формы из модальной, нужно:закрытие последней и не закрытие первой.
1. Вызываю модальную форму из главной формы (немодальной). 2. Вызываю другую модальную форму из первой (п.1) модальной формы. 3....

Очистка
У меня задача зделать в форме канкулятор на сложение. Все уже написал, не погу понять как зделать что бы Label, после того как в него...

Очистка БД
как sql запросом очистить БД: удалить все таблицы, индексы и т.п, т.е. не только данные но и всю структуру?

очистка из бд за 24 ч
очистка из бд за 24 ч написал себе чат и хочу сделать очистку сообщение старые чтоб удалялись правильно сформировал запрос ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru