Соединение MySQL: глобально или в объекте?

У меня есть два класса PHP. Один из них – для подключения к базе данных, построения запросов, их выполнения и отключения от базы данных. Другой класс предназначен для пользователей: добавляет их, обновляет, регистрирует их и т. Д.

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

Преимущество, которое я вижу для подключения во всем мире, заключается в том, что после подключения у меня есть это соединение, доступное для выполнения нескольких методов. Недостатком является то, что мне нужно беспокоиться о передаче объекта базы данных.

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

Есть ли наилучшая практика для использования, или это действительно зависит от количества пользователей и спецификаций сервера, например, памяти, процессора и т. Д. Системе необходимо поддерживать до 1000 пользователей, поэтому она довольно малая.

Любая обратная связь будет высоко оценена.

-Ryan

Создайте функцию, которая создает соединение по требованию и обеспечивает доступ к объекту подключения:

function getDb() { static $db; if (!$db) $db = ...; return $db; } 

Принятый в класс этот подход называется Singleton

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

На самом деле, хотя это может показаться противоречивым, большинство экспертов PHP (включая меня) рекомендуют избегать использования mysql_close () вообще, если только не существует насущной причины. Это связано с тем, что в любом случае это исправляется автоматически при очистке PHP, поэтому добавление mysql_close () просто создает дальнейшее ухудшение производительности.

Определенно отслеживайте и повторно используйте одно соединение в базовом классе базы данных. Вышеприведенный пример является хорошим примером создания и возврата этого соединения по мере необходимости из класса DB.

Чтобы упростить доступ к этому соединению с ваших реальных объектов, вы могли бы создать класс базовых объектов (называемый DBable или что-то еще), который вызывает getDb в его конструкторе и назначает его локальной переменной $ db внутри этого класса. Затем все ваши объекты, которым нужен доступ к базе данных, могут расширить этот класс DBable и всегда иметь ссылку на $ db, доступную неявно, без необходимости запоминать вызов getDb во всем мире.

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

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

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

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