leni_m
@leni_m
ЧупаКобрус

Можно ли соединиться с бд один раз?

Есть index.html, в котором есть код:
<script>
$("#search").on("input", function () {
    $.ajax({
                method: "POST",
                url: "search.php",
                data: {search: $(this).val()}
            })
}
</script>

search.php
require_once 'connection.php';
        $dsn = "mysql:host={$host};dbname={$database}";
        $db = new PDO($dsn, $user, $password);
        $db->exec("set names utf8");
        ...

И получается при каждом ajax запросе заново соединяемся с бд.
Можно ли как-то открыть соединение один раз, и больше его не трогать?
  • Вопрос задан
  • 177 просмотров
Решения вопроса 3
Adamos
@Adamos
И сервер будет сидеть с открытым соединением и ждать у моря погоды, не зная, не закрыл ли юзер эту страницу вообще?
На самом деле, обращение к базе - не настолько затратная процедура, как поддержка соединения с ней без всякой на то необходимости.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
"PHP рожден, чтобы умирать".
Это значит что после каждого запроса пхп скрипт умирает, вместе с переменной $db.
Поэтому код соединения с БД в любом случае должен исполняться заново.

Если же говорить о соединении с БД, то в теории, можно конечно использовать какой-нибудь пул коннектов, но это такая банка с тараканами, которую лучше не трогать без совсем уж крайней на то необходимости. И точно не для "моего первого скрипта на пэхапэ".
Ответ написан
Комментировать
@Excent163
Если я правильно понял вопрос, то обойти создание нового подключения можно с помощью паттерна Singleton.
Выглядит это так:
class Db
{
    private $pdo;

    private static $instance;

    private function __construct()
    {
        $dbOptions = (require __DIR__ . '/../../settings/setting.php')['db'];
        
        $this->pdo = new PDO(
            'mysql:host=' . $dbOptions['host'] . ';dbname=' . $dbOptions['dbname'],
            $dbOptions['user'],
            $dbOptions['password']
        );
        $this->pdo->exec('SET NAMES UTF8');
    }

    public static function getInstance(): self
    {
        // если объект подключения не создан и равен NULL
        if (self::$instance === null) {
            // то создается новый объект класса Db;
            self::$instance = new self();
        }
        // если подключение создано, просто возвращаем уже созданное подключение
        return self::$instance;
    }
}

Соответственно и подключение уже будет происходить через:
Db::getInstance();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы