Я пытаюсь написать код с несколькими классами, которые позже будут иметь много подключений/запросов к БД.
Мой вопрос: подключается ли 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
достаточно?
@Phil Не могли бы вы привести пример, пожалуйста?
Когда вы создаете экземпляр 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 сам по себе является сомнительным решением, имеющим те же проблемы, что и глобальные переменные.
Ааа, я с радостью удалю его сейчас, спасибо за информацию! Что бы вы предложили?
@YourCommonSense Каков, по вашему мнению, лучший подход в этом вопросе? (подключение к базе данных в нескольких классах), я думал о подключении к базе данных с помощью PDO в методе __construct()
каждого класса, а затем закрыть соединение с помощью метода __destruct()
. как вы думаете, это приемлемо и хорошая практика? Поскольку передача соединения с классами будет поддерживать соединение активным до завершения выполнения (что я считаю плохим с точки зрения производительности)
@ J.Doe Преждевременная оптимизация - корень всех зол, и ваши предположения - прекрасный пример этого правила. Пытаясь избежать воображаемой(!) проблемы с производительностью, вы собираетесь испортить производительность в реальности. Поскольку он подключается к каждому классу, убедитесь, что ваш сервер базы данных не работает. Таким образом, текстовое время попытайтесь улучшить производительность Только, если у вас есть реальная проблема, а не воображаемая.
@YourCommonSense Большое спасибо за разъяснение, я многому научился! Не могли бы вы одобрить использование следующего метода с учетом производительности: Static solution for the Object Oriented Code
phpdelusions.net/pdo/pdo_wrapper#static_instance (на веб-сайте будет 500/600 одновременных пользователей с ~ 1000 запросов в секунду)
@J.Doe, кстати, будучи автором страницы, на которую вы ссылаетесь, я могу только повторить то, что там было сказано - это компромисс, который можно использовать, если ваш код плохо организован. Тем не менее, с точки зрения производительности это то же самое, что и внедрение зависимостей. Пока вы сохраняете одно соединение, все методы одинаковы.
@YourCommonSense Вы потрясающие, спасибо за все полезные заметки и замечательный сайт!
@ J.Doe, чтобы уточнить то, что я сказал ранее. Есть много недостатков в подключении каждого класса. Вы не можете использовать транзакции или другие функции, связанные с подключением, между классами. Соединение является относительно медленной операцией, поэтому чем больше у вас есть, тем хуже производительность. И, конечно же, печально известная ошибка слишком большого количества подключений. типичное приложение может иметь сотни или тысячи объектов, а это означает, что открыты сотни или тысячи подключений.
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