Православный коннект а базе данных

craz

Нестандартное звание
Там другой подход.
По поводу заворачивания SQL в отдельные операторы типа select('name')->from('table')->where->addcondition() было обсуждение в топике с Amdy, возвращаться я к нему не хочу.
Возможно, я неправ, но такой подход, во-первых, не устраивает лично меня, а во-вторых, перетащить на него орду пыхапёров - задача нереальная.
инструмент должен быть ПРОСТЫМ.
причина бешеной популярности пыха -в простоте.
я хочу соблюсти максимальную простоту (можно назвать это близостью к говнокоду) при максимальной же безопасности
простота никому не нужна уже(не надо тащить в профессию насильно!!!), а то так и писали бы на асмблере. Нужны инструменты.

Имхо этот возврат того же zf к консоле это какое то чванство элитарности... ну бл..ть мы же программисты а не можем написать себе нормальный гуй, ну это же... это же не правильно нет?
 

craz

Нестандартное звание
имеется в виду интерфейс для работы с бд, не? какой гуй?
любой гуй! мега гуй...

А ты хочешь сказать с базами есть гуй хороший?

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

WMix

герр M:)ller
Партнер клуба
serglt
а можешь объяснить, для чего пишется именно так,
PHP:
$sqlAlbum = Sql::getInstance ('album');
а не
PHP:
$sqlAlbum = new Sql('album');
?
^^^ тут я думаю что разговор про соеденение НЕ про запрос
возможно ты даже прав, это уже не синглтон, и огромной раздницы не будет

я бы все же в конфиге все же сделал
PHP:
return array (
    'default' => array( 'host' => 'localhost', 'port' => 3306 ....),
    'other' => array(...),
);
а уже в объекте ->selectDatabase('other')

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

а дальше просто мысль...
PHP:
unset($opt); // I am paranoid
 

fixxxer

К.О.
Партнер клуба
Фанат
Эммм... Ну.
PHP:
class Connection_Mysql {
    public function __construct(array $connParams) { ... }
    // ...
}

class Connection_Pool {

    protected $config;
    protected $connections = array();

    // @param $config array( 'name1' => array(connection params), 'name2' => array(connection params)... )
    public function __construct(array $config) {
         $this->config = $config;
    }

    public function __get($key) {
         if (!isset($this->connections[$key])) {
              $this->connections[$key] = $this->createConnectionByName($key);
         }
         return $this->connections[$key];
    }

    protected function createConnectionByName($name) {
         if (!isset($this->config[$name])) {
             throw new Exception("Unknown connection name: '$name'");
         }
         return new Connection_Mysql($this->config[$name]); // вообще тут может быть фабрика - всякие там мемкеши, монги...
    }

    // тут еще можно сделать всякие прикольные штуки типа итератора по соединениям, глобальной транзакции и все такое

}

// ..........

class Model {

     protected $Pool;
     protected $connectionName = 'default';
     protected $Connection = null;

     public function __construct(Connection_Pool $ConnectionPool) {
          $this->Pool = $ConnectionPool;
     }

     protected function getDb() {
          if (null === $this->Connection) {
              $this->Connection = $this->Pool->{$this->connectionName};
          }
          return $this->Connection;
     }

}
 

MiksIr

miksir@home:~$
В идеале класс должен быть атомарен, т.е. неделим на несколько назначений.
Т.у. у нас два действия - управление пулом соединений и производство самого соединения. Раз мы смогли словами разделить - значит и классами имеет смысл разделить.
Но это в общем в идеальном мире.
На практике бывает всякое. Я вот тоже часто использую то, что кто-то назвал мультитоном (serglt на первой странице), т.е. когда у getInstance есть параметр. Чем-то оно даже дучше fixxxer-кого, ибо не позовляет создать соединение минуя пул, равно как создать два инстанса одного соединения.
 

~WR~

Новичок
Поддержу идею о том, что здесь лучше сделать два отдельных класса.

В идеале, ConnectionManager может полностью взять на себя всю грязную работу с конфигами.
Приложение будет просто на высоком уровне говорить: "Дай мне базу типа billing для пользователя 12345 на платформе 1".
Если завтра случился решардинг, то нужно будет исправить всего одно место.

Как только появилось много баз, значит будет и много функций для работы сразу с несколькими.
Те же общие транзакции, проверка доступности, массовое закрытие. И это явно логика выше уровнем, чем сборка запросов и escaping.
 

Вурдалак

Продвинутый новичок
fixxxer
Костя, я хочу сделать просто! Как можно проще! :)
Пишу-то я не только для себя. я хочу переучивать всех этих
mysql_connect() oir die("Could not connect to database");
mysql_query() or die("Error")
mysql_fetch_array()
Да, я знаю, что это утопия. но может, и получится. если код будет достаточно простым в использовании
Тут уж надо либо разделять pool и connection, либо продолжать тупо херачить mysql_connect(), а делать промежуточное решение — это «не нам и не вам».
 

Фанат

oncle terrible
Команда форума
слушайте, а это хорошая идея.
Это же развязывает мне руки.

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

кому надо работать - будут тупо делать global $db;
а кто на сложных щах - напишут себе пул коллекшен коннекшен синглтон фабрик
 
  • Like
Реакции: craz

~WR~

Новичок
Я еще добавлю один момент.
Есть такая интересная вещь как асинхронные запросы. Они прямо созданы для ситуаций, когда у вас есть до фига баз, и нужно со всех них собрать какую-то статистику за адекватное время.


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

При асинхронном подходе:
  • соединились со всеми базами
  • запустили на всех запросы
  • ждем 15 секунд
  • собираем вместе общий результат со всех баз сразу
  • радуемся

Весь процесс займет столько времени, сколько понадобится самой медленной базе.
Чем больше баз, и чем тяжелее запросы, тем выше profit.

Так вот, эта логика 100% просится в ConnectionManager. Он и соединится везде, и отправит, и будет ждать результата, и освободит ресурсы потом. И нормально обработает ошибку, если 1-2 базы из набора умерли в процессе выполнения.
 

MiksIr

miksir@home:~$
~WR~ это уже тянет на отдельный класс. На Фасад, наверно.
 

WMix

герр M:)ller
Партнер клуба
fixxxer
прикольно.... пул создает себе кучу соеденений, модель хранит пул..
те. мы берем модель, модель знает каким соеденением она пользуется и вызывает по ключику соеденение из пула...
яб еще заприватил бы $Pool и $Connection и написал бы что модель абстрактная...

а есть обьяснение тому, что ты пишешь аттрибуты большими буквами?
 

Фанат

oncle terrible
Команда форума
осталось только узнать, кому нужен этот пул со всеми оннектами в 99.9% случаев.
А так-то прикольно, конечно.
 

WMix

герр M:)ller
Партнер клуба
~WR~
а как заставить не ждать ответа? как в js call-back функцией?

нашел...
With MYSQLI_ASYNC (available with mysqlnd), it is possible to perform query asynchronously. mysqli_poll() is then used to get results from such queries.
 

fixxxer

К.О.
Партнер клуба
Фанат
я могу рассказать зачем мне нужен пул (это в комменте кратко пояснено там, и WR о похожих вещах говорит), но это, каэш, явно не потребности ЦА, ога. :)

WMix
объект с большой, скаляр/массив с маленькой. Не помню, почему так, как то сложилось :)
 
Сверху