Подключение к СУБД с использованием singleton-паттерна и проверкой на надежность соединения

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

Одним из распространенных подходов к работе с подключением к базе данных является использование singleton-паттерна. Этот подход позволяет создать только один экземпляр объекта соединения с базой данных, который может использоваться в различных частях приложения.

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

Рассмотрим пример класса для подключения к базе данных с использованием singleton-паттерна и проверкой надежности соединения.

<?php

namespace MyApp\Database;

use MyApp\Config\Config;
use PDO;
use PDOException;

final class Connection
{
    private static $instance = null;
    private $dbh;

    private function __construct()
    {
        $config = Config::getInstance();

        $dsn = "mysql:host={$config->get('db_host')};port={$config->get('db_port')};dbname={$config->get('db_name')};charset=utf8mb4";

        try {
            $this->dbh = new PDO($dsn, $config->get('db_user'), $config->get('db_pass'), [
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]);
        } catch (PDOException $e) {
            die("Failed to connect to database: " . $e->getMessage());
        }
    }

    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        } else {
            // Check connection reliability by performing a test query
            try {
                self::$instance->dbh->query('SELECT 1');
            } catch (PDOException $e) {
                // If an error occurred, the connection is lost and needs to be restored
                self::$instance = new self();
            }
        }

        return self::$instance->dbh;
    }

    public function __destruct()
    {
        $this->dbh = null;
    }

    public function __clone()
    {
    }

    public function __wakeup()
    {
    }
}

В данном примере класс Connection реализует singleton-паттерн с использованием статического свойства $instance. Конструктор класса создает объект PDO с параметрами подключения, которые берутся из файла конфигурации.

Метод getInstance() возвращает статический экземпляр объекта PDO

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *