PHP mySQL - Когда самое лучшее время для отключения от базы данных?

Я использую ленивое соединение для подключения к моей БД в моем объекте БД. Это в основном означает, что он не вызывает mysql_connect() до тех пор, пока первый запрос не будет передан ему, и впоследствии он снова перейдет к повторному подключению после.

Теперь у меня есть метод в моем классе DB под названием disconnectFromDB(), который в значительной степени вызывает mysql_close() и устанавливает $_connected = FALSE (поэтому метод query() будет знать, чтобы снова подключиться к БД). Если это нужно вызывать после каждого запроса (как частной функции) или извне через объект... потому что я думал о чем-то вроде (только код)

$students = $db->query('SELECT id FROM students');

$teachers = $db->query('SELECT id FROM teachers');

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

$db->disconnectFromDB();

Или я должен просто включить эту строку выше в самом конце страницы?

Какие преимущества/недостатки есть? Что лучше всего работает в вашей ситуации? Есть ли что-то действительно неправильное, забыв закрыть соединение mySQL, помимо небольшой потери производительности?

Цените свое время, чтобы ответить.

Спасибо!

Ответ 1

Насколько я знаю, если вы не используете постоянные соединения, ваше соединение с MySQL будет закрыто в конце выполнения страницы.

Следовательно, вы вызываете disconnect, ничего не добавите, и поскольку вы выполняете ленивое соединение, может возникнуть создание второго соединения, если вы или другой разработчик допустили ошибку и отключились в неподходящее время.

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

Ответ 2

Я просто прочитал этот комментарий на веб-сайте PHP относительно постоянного соединения, и было бы интересно узнать:

Здесь приведены важные причины НЕ использовать постоянные соединения:

  • Когда вы блокируете таблицу, обычно она разблокируется, когда соединение закрывается, но поскольку постоянный соединения не закрываются, любые таблицы вы случайно оставите заблокированным остаются заблокированными, и единственный способ разблокировать их - дождаться подключение к таймауту или обработать. Такая же проблема блокировки происходит с транзакциями. (Видеть комментарии ниже 23 апреля 2002 г. & 12-июля-2003)

  • Обычно временные таблицы удаляются, когда соединение закрывается, но поскольку постоянные соединения делают не закрываются, временные таблицы не так временный характер. Если вы явно не используете отбрасывать временные таблицы, когда вы сделано, эта таблица уже существует для нового клиента, повторно использующего тот же подключение. Такая же проблема возникает с настройкой переменных сеанса. (Видеть комментарии ниже 19-ноя-2004 & 07-Aug-2006)

  • Если PHP и MySQL находятся на одном сервере или в локальной сети, время соединения может быть незначительным, в в этом случае нет преимущества для постоянные соединения.

  • Apache не работает с постоянными подключениями. Когда это получает запрос от нового клиента, вместо использования одного из доступных дети, у которых уже есть постоянное соединение открыто, оно имеет тенденцию для порождения нового ребенка, который затем должен откройте новое соединение с базой данных. Эта вызывает избыточные процессы, которые спать, тратить ресурсы и вызывая ошибки при достижении максимальные соединения, плюс он побеждает любое преимущество постоянных соединений. (См. Комментарии ниже, 03-Feb-2004, и в сноске http://devzone.zend.com/node/view/id/686#fn1)

(я не был тем, кто написал текст выше)

Ответ 3

Не утруждайте себя разъединением. Стоимость проверки $_connected перед каждым запросом в сочетании со стоимостью фактического вызова $db->disconnectFromDB(); для закрытия закрытия в конечном итоге будет дороже, чем просто позволить PHP закрыть соединение, когда оно будет завершено с каждой страницей.

Рассуждение:

1: Если вы оставите соединение открытым до конца script:

  • PHP-движок запускается через внутренний массив соединений mysql
  • PHP-движок вызывает mysql_close() внутри каждого соединения

2: Если вы сами закрываете соединение:

  • Вы должны проверить значение $_connected для каждого отдельного запроса. Это означает, что PHP должен проверить, существует ли переменная $_connected A) B) является логической, а C) является true/false.
  • Вам нужно вызвать функцию "отключить", а вызовы функций - одна из более дорогих операций в PHP. PHP должен проверить, что ваша функция A) существует, B) не является частной/защищенной и C), что вы предоставили достаточно аргументов для вашей функции. Он также должен создать копию переменной $connection в новой локальной области.
  • Тогда ваша функция disconnect вызовет mysql_close(), что означает, что PHP A) проверяет, что mysql_close() существует и B), что вы предоставили все необходимые аргументы mysql_close() и C), что они являются правильным типом (mysql ресурсы).

Возможно, я не был на 100% прав, но я считаю, что шансы в моей пользе.

Ответ 5

Основной блок исполнения предположительно представляет собой целую script. То, что вы в первую очередь хотите использовать ресурсы (то есть базу данных) эффективно, эффективно и эффективно, - это всего один script.

Однако, PHP, Apache/IIS/что-то еще, имеют свои собственные жизни; и они могут использовать соединения, которые вы открываете за пределами своей жизни script. Это знак постоянных (или объединенных) соединений.

Вернитесь к script. Оказывается, у вас есть много возможностей проявить творческий подход к использованию этого соединения во время его выполнения.

Типичный наивный script будет снова и снова ударять по соединению, подбирая локально соответствующие обрывки данных, связанных с данными объектами/модулями/выбранными параметрами. Здесь процессуальная методология может нанести штраф в этом соединении путем открытия, запроса, получения и закрытия. (Обратите внимание, что любой один запрос останется в живых до тех пор, пока он не будет явно закрыт, или конец script. Будьте осторожны, обратите внимание, что соединение и запрос совсем не совпадают. Запросы связывают таблицы, связывают связи. (в большинстве случаев отображается в виде сокетов). Поэтому вы должны осознавать правильную экономию при использовании обоих.

Самая экономичная стратегия в отношении запросов - это как можно меньше. Я часто пытаюсь построить более или менее сложный объединенный запрос, который возвращает полный набор данных, а не разлагает запросы небольшими частями.

Ответ 6

Использование ленивого соединения, вероятно, хорошая идея, так как вам может не понадобиться соединение с базой данных вообще для некоторых script исполнений.

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