Подключен ли PDO к базе данных сразу или после подготовки/запроса

Я пытаюсь написать код с несколькими классами, которые позже будут иметь много подключений/запросов к БД.

Мой вопрос: подключается ли PDO к базе данных, как только выполняется следующая строка, и она будет оставаться подключенной до тех пор, пока не будет закрыта?

$pdo = new PDO($dsn, $user, $pass, $options);

Или он ждет, пока мы не сделаем следующее для подключения, например:

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();

// Closing connection
$stmt = null;

Если он не подключен сразу, когда мы делаем new PDO(), то я могу легко сделать переменную $pdo глобальной и использовать ее в каждом классе, иначе мне придется подключаться в каждом классе отдельно с помощью метода __construct(), а затем закрыть соединение по методу __destruct(). (Я до сих пор не уверен, что это лучший способ повысить производительность)

P.S. Нам также нужно установить $pdo = null, чтобы закрыть соединение? или $stmt = null достаточно?

Upon successful connection to the database, an instance of the PDO class is returned to your script. The connection remains active for the lifetime of that PDO object. To close the connection, you need to destroy the object by ensuring that all remaining references to it are deleted—you do this by assigning NULL to the variable that holds the object. If you don't do this explicitly, PHP will automatically close the connection when your script ends.php.net/manual/en/pdo.connections.php
user3783243 08.04.2019 02:21
«Я до сих пор не уверен, что это лучший способ повысить производительность». ? это не так. Передайте соединение с вашими конструкторами классов как зависимость
Phil 08.04.2019 02:43

@Phil Не могли бы вы привести пример, пожалуйста?

J. Doe 08.04.2019 03:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
174
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы создаете экземпляр new PDO(), он попытается сохранить соединение с базой данных.

Connections are established by creating instances of the PDO base class.

Источник

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

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

Было бы неплохо закрыть соединение с базой данных раньше. Однако PHP сделает это за вас после завершения выполнения скрипта.

If you don't do this explicitly, PHP will automatically close the connection when your script ends.

Источник

Надеюсь, это поможет! ??

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

Your Common Sense 08.04.2019 05:38

Ааа, я с радостью удалю его сейчас, спасибо за информацию! Что бы вы предложили?

Johnny 08.04.2019 06:09

@YourCommonSense Каков, по вашему мнению, лучший подход в этом вопросе? (подключение к базе данных в нескольких классах), я думал о подключении к базе данных с помощью PDO в методе __construct() каждого класса, а затем закрыть соединение с помощью метода __destruct(). как вы думаете, это приемлемо и хорошая практика? Поскольку передача соединения с классами будет поддерживать соединение активным до завершения выполнения (что я считаю плохим с точки зрения производительности)

J. Doe 08.04.2019 14:41

@ J.Doe Преждевременная оптимизация - корень всех зол, и ваши предположения - прекрасный пример этого правила. Пытаясь избежать воображаемой(!) проблемы с производительностью, вы собираетесь испортить производительность в реальности. Поскольку он подключается к каждому классу, убедитесь, что ваш сервер базы данных не работает. Таким образом, текстовое время попытайтесь улучшить производительность Только, если у вас есть реальная проблема, а не воображаемая.

Your Common Sense 08.04.2019 14:59

@YourCommonSense Большое спасибо за разъяснение, я многому научился! Не могли бы вы одобрить использование следующего метода с учетом производительности: Static solution for the Object Oriented Codephpdelusions.net/pdo/pdo_wrapper#static_instance (на веб-сайте будет 500/600 одновременных пользователей с ~ 1000 запросов в секунду)

J. Doe 08.04.2019 15:20

@J.Doe, кстати, будучи автором страницы, на которую вы ссылаетесь, я могу только повторить то, что там было сказано - это компромисс, который можно использовать, если ваш код плохо организован. Тем не менее, с точки зрения производительности это то же самое, что и внедрение зависимостей. Пока вы сохраняете одно соединение, все методы одинаковы.

Your Common Sense 08.04.2019 15:27

@YourCommonSense Вы потрясающие, спасибо за все полезные заметки и замечательный сайт!

J. Doe 08.04.2019 16:11

@ J.Doe, чтобы уточнить то, что я сказал ранее. Есть много недостатков в подключении каждого класса. Вы не можете использовать транзакции или другие функции, связанные с подключением, между классами. Соединение является относительно медленной операцией, поэтому чем больше у вас есть, тем хуже производительность. И, конечно же, печально известная ошибка слишком большого количества подключений. типичное приложение может иметь сотни или тысячи объектов, а это означает, что открыты сотни или тысячи подключений.

Your Common Sense 08.04.2019 16:28

Другие вопросы по теме