mvc и сессии к БД

Горбушка

Ищу её...
Регистрация
2 Май 2008
Сообщения
3.444
Реакции
2.524
Всем привет.

Решил я переходить наконец-то на ООП и столкнулся с интересным кейсом...
Если убрать всю мишуру, то в части работы с БД все советуют примерно такой подход:

PHP:
class db{

    public $db;

    function __construct()
    {
        $this->db = mysqli_connect(...);

    }

}

abstract class Model {

    public $db;

    public function __construct() {
        $this->db = new Db;
    }

}

class Main1 extends Model {

    public function getNews() {
        ...
    }

}

class Main2 extends Model {

    public function getNews() {
        ...
    }

}

Всё здорово и даже работает, но логи показывают, что каждая модель вызывает класс db отдельно и соответственно это новая сессия к базе данных.
На каждый раздел, каждый модуль и т.д. должна быть своя модель. Исходя из этого я исчерпаю лимит сессий на сервере БД открытием всего 1 страницы.

Это я что-то не понимаю в жизни или пример для обучения взят откровенно хреновый?
 
И вам не хворать,

Да, на один запрос/проход - один коннект к базе
Но сама абстрактная модель должна быть реализована как синглтон
Чтобы в одном проходе, если нужно будет обращаться к разным моделям, все было в рамках одного коннекта, и даже объекта бд
пхп однопоточный, как минимум классическая реализация

А даже не представляю, как оно может быть по другому
Пхп рожден, чтобы умирать, и в самом конце соединение нужно закрывать

У вас как сейчас?
Может я вас недопонял....
 
Чтобы в одном проходе, если нужно будет обращаться к разным моделям, все было в рамках одного коннекта, и даже объекта бд
Вот я как раз и не понимаю как сделать так, чтобы всё шло через общий коннект...

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

Я бы пошёл по пути той же Joomla со статичным классом, но у меня несколько баз данных... Т.е. должны быть именно экземпляры...
Wordpress использует global $wpdb; - но смысл мне тогда от mvc и ооп, если везде надо global вписывать? Так я и на процедуре могу и global пихать не нада ))
 
Последнее редактирование:
Могу ошибаться, сужу из примеров ларавел, там предлагают на каждую бд свой коннект
С одной стороны, оно правильно, для каждой бд свой пользователь, со своими правами
С другой стороны вроде как накладно
Я между однотипными бд просто юзал: $this->db->query('USE otherDBName')
И после получения данных: $this->db->query('USE mainDBName')
Тем самым оставляя один коннект на группу баз
На сколько выигрыш в производительности, не знаю, просто уже было лень плодить конекты
Про подобное лучше на тематический по конкретному фреймворку, если юзаете таковой
 
Нашёл )))

PHP:
abstract class Model {

    public $db;

    protected static function getDb() {

        static $db = null;

        if ($db === null) {
            $db = mysqli_connect(...);
            var_dump($db);
        }

        return $db;

    }

}

class User extends Model
{
    public static function getAll()
    {
        $db = parent::getDB();
        var_dump($db);
    }
}

class News extends Model
{
    public static function getAll()
    {
        $db = parent::getDB();
        var_dump($db);
    }
}

$User = new User;
$User::getAll();

$News = new News;
$News::getAll();

Теперь $db передаётся в дочерние модели ) Получил примерно то, что хотел ) Дальше можно это развивать...
 
Могу ошибаться, сужу из примеров ларавел, там предлагают на каждую бд свой коннект
Нет, это понятно. Каждая база = новое подключение )
Меня смущало, что когда 2 модели используют 1 базу - было всё равно 2 коннекта.

Надо на самом деле в сторону laravel смотреть,.. Давно на него поглядываю...

Он же умеет работать одновременно с несколькими базами? К примеру сам сайт использует MySQL, а какие-нибудь отчёты строим из Oracle?
 
Последнее редактирование:
Он же умеет работать одновременно с несколькими базами? К примеру сам сайт использует MySQL, а какие-нибудь отчёты строим из Oracle?
Про Oracle утверждать не могу, но гуглиться))
С несколькими бд Laravel работает, и не создает несколько коннектов при обращение в один проход по одной бд
 
Если пока не до Laravel, а уже хочется, взгляните на мои наработки, вдруг по душе)
 
Посмотрел я на laravel... Чёт жуть...
composer, nodejs, сам laravel из консоли кучу чего вызывает...

А главное зачем...

composer - скачать и распаковать zip архив, всё...
nodejs скопировать css и пройтись gzip

Они серьёзно?

Да и тянуть на прод всю эту мишуру для разработки - зачем? Собрал маленький zip, закинул в папку и всё работает... Нет, тут без ssh ещё надо постараться )
Переборщили они как-то...
 
Назад
Сверху