Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class DataBase 
:(
    Опции темы
Zorak
Дата 17.3.2013, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Здраствуйте дамы и господа. У меня вопрос чисто теоретический.... пока
Написал класс, который отвечает за работу с базой данных на страницах моего сайта.
Вот некоторые методы класса:
1. __construct() - обеспечивает соединение с базой данных
2. __destruct() - обеспечивает закрытие существующего соеднения с базой данных
3. методы select(), insert(), update(), delete() - тут и так все понятно.

За иронией судьбы (так сказать)  я подключаю этот класс на каждой странице и в некоторых классах, где он мне требуется. Естессно при создании обьекта класса происходит подключение к базе данных, далее браузеру передается сгенерированная страница по коду, ну и в конце уничтожается обьект класса, в следствии чего и разрывается соединение с базой данных. И таким макаром происходит на каждой странице.
Проблема в том, что я некоторым чутьем чуствую что гдето промахнулся, а в друг потом напишу несколько страниц, где будут пересекатся разные классы и обьект класса DataBase создастся два раза а того более хуже больше чем два... 
И так, вопроса два:
1. Чем это чревато?
2. как это исправить ? (хотябы куда и под каким углом смотреть).

Не хочется потом переписывать фиг знает что и сколько...

Спасибо!


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
Gold Dragon
Дата 18.3.2013, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



ну  для класса базы данных тебе нужно воспользоваться шаблоном проектирования Singleton. Т.е. Объект создаётся всего один раз.. Вот примерная структура

Код

class GDDatabase
{
    /** @var string - хост */
    private $_db_host;

    /** @var string - пользователь */
    private $_db_user;

    /** @var string - пароль */
    private $_db_password;

    /** @var string - имя БД */
    private $_db_name;

    /** @var string - порт */
    private $_db_port;

    /** @var string - сокет */
    private $_db_socket;

    /** @var int - флаг отладки */
    private $_db_debug;

    /** @var int - флаг кэширования */
    private $_db_caching;

    /** @var string - префикс для таблиц */
    private $_db_prefix;

    /** @var string - путь до файлов кэширования */
    private $_db_cache_dir;

    /** @var int - время кэширования */
    private $_db_cache_time;

    /** @var null|object - интерфейс */
    protected static $_resource = null;

    /** @var \mysqli - MySQLi object */
    protected $db_resource;

    /** @var \mysqli_stmt - MySQLi_STMT object */
    protected $stmp;

    /***************************************************************************
     * Magic methods
    /***************************************************************************/

    /**
     * Конструктор
     * Защищаем от создания через new
     */
    private function __construct()
    {
        // Сохранение основных настроек
        // т.е. достаём из конфигурации настройки для подключения к БД и сохраняем их

        $this->_db_host = JCore::getCfg('host');

        $this->_db_user = JCore::getCfg('user');

        $this->_db_password = JCore::getCfg('password');

        $this->_db_name = JCore::getCfg('db');

        $this->_db_port = JCore::getCfg('port');

        $this->_db_socket = JCore::getCfg('socket');

        $this->_db_debug = JCore::getCfg('debug');

        $this->_db_caching = JCore::getCfg('caching');

        $this->_db_prefix = JCore::getCfg('dbprefix');

        $this->_db_cache_dir = JCore::getCfg('cachepath');

        $this->_db_cache_time = JCore::getCfg('cachetime');

        // Проверка существует ли вообще функция подключения
        if (!function_exists('mysqli_connect')) {
            throw new Exception(_EXCEP_MYSQLI_MODULE_NOT);
        }

        // Временно отключаем вывод ошибок
        $_error = error_reporting();
        error_reporting(0);

        // Создаём объект базы
        $this->db_resource = new mysqli(
            $this->_db_host,
            $this->_db_user,
            $this->_db_password,
            $this->_db_name,
            $this->_db_port,
            $this->_db_socket);

        if ($this->db_resource->connect_error) {
            throw new Exception(_EXCEP_ERROR_CONNECT_DB);
        }

        // Возвращаем состояние вывода ошибок
        error_reporting($_error);

        // Устанавливаем кодировку
        if (!$this->db_resource->set_charset('utf8')) {
            throw new Exception(sprintf(_EXCEP_ERROR_LOADING_CHARACTER_SET, $this->db_resource->character_set_name()));
        }

        // записываем логи запросов
        if ($this->_db_debug) {
            $this->db_resource->query('set profiling=1');
            $this->db_resource->query('set profiling_history_size=100');
        }
    }

    /**
     * Защищаем от создания через клонирование
     */
    private function __clone()
    {
    }

    /**
     * Защищаем от создание через unserialize
     */
    private function __wakeup()
    {
    }

    /**
     * @static Подключение класса
     *
     * @return object
     */
    public static function Init()
    {
        if (!is_object(self::$_resource)) {
            $class_name = __CLASS__;
            self::$_resource = new $class_name;
        }

        return self::$_resource;
    }

}


использовать можно так
Код

$_db = GDDatabase::Init();

Т.е. объект создаётся один раз, а все остальные подключения просто возвращают то что уже создано

ну  и дальше твои методы

Код

$_db->select .....
$_db->insert .....


или  сразу
Код

GDDatabase::Init()->select ....
GDDatabase::Init()->insert ....




ps
если вдруг что, то вот мой класс-обёртка  smile 
https://code.google.com/p/gddatabase/



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Zorak
Дата 18.3.2013, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Такс, основную суть я понял, спасибо тебе огромнейшое, подарил мне как минимум одну или две бессонных ночей)... ушол разбиратся, если что буду писать.


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
ksnk
Дата 18.3.2013, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Zorak, Мне отчего-то нравятся функции драйвера базы данных, которые возвращают не рессурсы, а данные.
Интерфейс получается, кроме служебных конструкторов-деструкторов еще и 
  • insert - возвращает количество вставленных строк
  • update - количество измененных строк.
  • select - возвращает массив массивов строк
  • selectCell - одно значение
  • selectCol - столбец - массив значений
  • selectRow - строка
Так получится менее затратно переходить на новый драйвер базы данных. с mysql, например на mysqli.

Это сообщение отредактировал(а) ksnk - 18.3.2013, 09:40


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 18.3.2013, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



ksnk, однозначно ! А иначе для чего нужна обёртка  smile 

а ещё вот какие:
  • selectAll - получить все данные указав только таблицу
  • getCacheSql - ну это запрос к базе, но при использовании кэширования
  • getQueryInfo - получение дополнительной информации о запросе (количество строк, затронутых последним запросом, ID предыдущей
операцией INSERT, число строк в результате запроса, число полей в заданном выражении, ошибка последнего запроса и т.п.)

соответственно ещё 
  • getError
  • getErrno

ЗЫ
у меня в классе это всё реализовано. Да и используются подготовленные данные, так что нет смысла что-то экранировать и бояться  smile 


Это сообщение отредактировал(а) Gold Dragon - 18.3.2013, 10:09


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sanchezzz
Дата 18.3.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 1
Всего: 60



А я сижу делаю обертку вокруг PDO для своего микро фреймворка
Поделюсь с задумкой а может для кого то идеями.

Есть класс db - это коллекция синглитон адаптеров, которые работают с разными СУБД, NOSQL
С какой базой данной работать определяется конфигом в виде массива. 

db::make() - загрузка настройки по умолчанию, db::make('mongo') загрузка указанной настройки.

dbPdo Обертка над PDO
dbMongo Обердка над монго. 

Работа с БД происходит точно также как и с обычным PDO за  исключением того что все методы можно вызвать цепочкой, меня жутко бесило это  в обычном PDO что это нельзя было это сделать.
$db = db::make();
$db->cache($duration)->prepare ... работа с кэшем, кэш также определяется в конфиге к БД, как и профайлер, логер.

$db->prepare($sql)->execute(array(':id',1)) 
->fetchAll()  // результат все
->fetch()     // первоя строка + курсор в цикде.
->fetchCulumn($column_name) // результат указанный столбец
->asModel()  // результат в виде AR модели или ее подобие (допиливаю последнее время)

$db->prepare($sql)
->bindValue 
->bindParam 
->execute() 
->fetchAll

Эмуляция плейхостов нужна для логера и дебагера.

$db->saveModel($this_class); // сохранить указанную AR модель под текущую БД. Под каждую БД приходится писать свои костыли что бы сохранить модель.
// Модель нечего нечего не знает о базе. 
// Модель спроектирована уже с необходимой структурой и связями.

$db->query($prepare,$execute,$debug=false); // результат INSERT UPADETE SELECT DELETE
$db->insert($table, $arraySet);
$db->update($table, $arraySet);




--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Fortop
Дата 18.3.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(Gold Dragon @  18.3.2013,  07:39 Найти цитируемый пост)
ну  для класса базы данных тебе нужно воспользоваться шаблоном проектирования Singleton.

Разве?

А я думал что он нужен для подключения/адаптера, и то не всегда smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gold Dragon
Дата 18.3.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Цитата(Fortop @  18.3.2013,  15:48 Найти цитируемый пост)
А я думал что он нужен для подключения/адаптера, и то не всегда 
а по понятнее?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Fortop
Дата 18.3.2013, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



По понятнее?

Избежать множества запросов синглтоном нельзя.
Но избежать множества открытий/закрытий соединения - можно.

Вся привычка делать класс работы с БД синглтоном базируется как раз на этой логике.
А раз так... то делаем синглтоном класс подключения/адаптера и используем его в своих обертках.

Код

// one.php
$db = new SuperWrapper(Connection::getInstance());
$db->query(......)

// two.php
$somewhereElse = new DuperWrapper(Connection::getInstance());





--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
baldina
Дата 18.3.2013, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  18.3.2013,  16:42 Найти цитируемый пост)
А раз так... то делаем синглтоном класс подключения/адаптера и используем его в своих обертках.

и в чем разница/выигрыш? 

Это сообщение отредактировал(а) baldina - 18.3.2013, 17:32
PM MAIL   Вверх
Fortop
Дата 18.3.2013, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(baldina @  18.3.2013,  17:32 Найти цитируемый пост)
и в чем разница/выигрыш? 

Разница в архитектуре.

А вот выигрыш - вопрос спорный smile
Несколько более гибкое приложение, при условии развитого DBAL


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
baldina
Дата 18.3.2013, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  18.3.2013,  17:45 Найти цитируемый пост)
Несколько более гибкое приложение

а если потребуется еще одно соединение?

Добавлено через 7 минут и 7 секунд
синглтон - не архитектура, а индивидуальное, редко полезное решение.
любая архитектура на его основе плохо масштабируется.

хорошая архитектура (в частности) - это когда есть согласованная структура приложения и его частей, каждая из которых отвечает за своё. тогда не понадобятся синглтоны, а повсеместные $db = new myDb() или $db = myDb::getInstance() превратятся в $app->getDb()
PM MAIL   Вверх
Fortop
Дата 18.3.2013, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(baldina @  18.3.2013,  17:51 Найти цитируемый пост)
а если потребуется еще одно соединение?

Модифицируем до пула.
Или низводим с уровня синглтона соединения вообще и используем Registry для их хранения


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
baldina
Дата 18.3.2013, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  18.3.2013,  22:14 Найти цитируемый пост)
Модифицируем до пула.

массив-синглтон? массив синглтонов? масло масляное
Цитата(Fortop @  18.3.2013,  22:14 Найти цитируемый пост)
используем Registry

который тоже синглтон?

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

 smile 
PM MAIL   Вверх
Fortop
Дата 19.3.2013, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(baldina @  18.3.2013,  23:11 Найти цитируемый пост)
массив-синглтон? массив синглтонов? масло масляное

А кроме личных предпочтений к ношению розовых бикини аргументация будет?  smile 

Цитата(baldina @  18.3.2013,  23:11 Найти цитируемый пост)
потом обнаруживаются проблемы с последовательностью их инициализации

С последовательностью инициализации кого?
Соединений с БД?  smile 



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 19.3.2013, 08:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Вообще-то все драйвера и обертки нужны для того, чтобы писать красиво  smile То есть сначала нужно придумать как это будет написано, а потом уже реализовать, если это возможно.
Fortop предлагает писать так:
Код

// one.php
$db = new SuperWrapper(Connection::getInstance());
$db->query(......)
// two.php
$somewhereElse = new DuperWrapper(Connection::getInstance());


А baldina как предпочитает видеть этот кусок?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 19.3.2013, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



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

Цитата(Fortop @  19.3.2013,  02:11 Найти цитируемый пост)
Цитата(baldina @  18.3.2013,  23:11 )
потом обнаруживаются проблемы с последовательностью их инициализации
С последовательностью инициализации кого?

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

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

Добавлено через 5 минут и 23 секунды
Цитата(ksnk @  19.3.2013,  08:25 Найти цитируемый пост)
А baldina как предпочитает видеть этот кусок? 

Цитата(baldina @  18.3.2013,  17:51 Найти цитируемый пост)
$app->getDb() 

т.е. как угодно, но получая соединение из объекта приложения
Код

$db = new SuperWrapper($app->getDb());
// or
$db = $app->getSuperWrapperDb();
// or
$db = $app->getDb()->applyWrapper('Super');

PM MAIL   Вверх
Fortop
Дата 19.3.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(baldina @  19.3.2013,  10:16 Найти цитируемый пост)
я вижу решение в использовании единственного "как бы" синглтона - объекта типа Application, который и порядок инициализации обеспечивает, и предоставляет доступ к объектам, глобальным в контексте приложения, и сам является масштабируемым.

Наводящий вопрос.

Каким образом оно масштабируется?

Добавлено через 1 минуту и 57 секунд
Цитата(ksnk @  19.3.2013,  08:25 Найти цитируемый пост)
Вообще-то все драйвера и обертки нужны для того, чтобы писать красиво 

Увы, не для "красиво". А для того, чтобы не было мучительно больно в процессе поддержки и расширения приложения smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
baldina
Дата 19.3.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  19.3.2013,  13:19 Найти цитируемый пост)
Каким образом оно масштабируется?

добавлением метода в класс Application
само приложение может быть масштабировано созданием нескольких объектов Application (хотя к задачам веб это думаю не относится))
PM MAIL   Вверх
Fortop
Дата 19.3.2013, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(baldina @  19.3.2013,  13:36 Найти цитируемый пост)
само приложение может быть масштабировано созданием нескольких объектов Application

Итого? получаем кучку тех же самых синглтонов?  smile 
В чем тут отличие от масштабирования приложений на пхп?
И как порядок инициализации может мешать подобному масштабированию?  smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 19.3.2013, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Fortop @  19.3.2013,  13:19 Найти цитируемый пост)
Увы, не для "красиво".
Красота не бывает абстрактной. Она обязана приносить пользу  smile 

В программировании "красивая" польза будет
-- поддержка проекта, в дальнейшем, чужими людьми. Решается достаточной документацией и комментариями.
-- возможность дальнейшего роста проекта, добавление новых возможностей, фич. Решается проектированием и выбором масштабируемых решений.
-- повторная используемость кода. Это когда код (классы, функции и кусочки кода) в меру тупо и без особых изменений могут быть скопированы в другой, новый проект и там заработают правильно и достаточно эффективно. 

Вот эта третья красивость тянет за собой минимизацию зависимостей от окружения. Слова, которые определяются в других классах-функциях, должны по возможности исключаться, или быть изолированы в отдельном месте класса - функции... Так чтобы это не противоречило остальным факторам "красивого кода".


Это сообщение отредактировал(а) ksnk - 19.3.2013, 17:34


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 19.3.2013, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  19.3.2013,  17:01 Найти цитируемый пост)
Цитата(baldina @  19.3.2013,  13:36 )
само приложение может быть масштабировано созданием нескольких объектов Application
Итого? получаем кучку тех же самых синглтонов?
они уже не синглтоны, в том то и дело smile

В чем тут отличие от масштабирования приложений на пхп?

не php, а web. и если бы были, уже кто-нить придумал бы соотв. архитектурное решение
пример: приложение как расчетный модуль. если приложение организовано через единственный объект, можно завести еще один объект и параллельно решать две однотипные задачи. а если приложение содержит ряд синглтонов (или просто глобальных переменных)? 

Цитата(Fortop @  19.3.2013,  17:01 Найти цитируемый пост)
И как порядок инициализации может мешать подобному масштабированию?   

порядок инициализации может мешать масштабированию, если он требуется, но никто им не управляет
PM MAIL   Вверх
Fortop
Дата 19.3.2013, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(baldina @  19.3.2013,  18:30 Найти цитируемый пост)
приложение как расчетный модуль. если приложение организовано через единственный объект, можно завести еще один объект и параллельно решать две однотипные задачи. а если приложение содержит ряд синглтонов (или просто глобальных переменных)? 

В php нет тредов.
Поэтому завести еще один объект и решать параллельно можно только вместе с новым процессом.

А поскольку процессы между собой изолированы, то никаких сложностей не возникает (если вы, конечно, не применяли ухищрений, например, с shmop) ни с рядом синглтонов, ни с глобальными переменными.

Цитата(baldina @  19.3.2013,  18:30 Найти цитируемый пост)
порядок инициализации может мешать масштабированию, если он требуется, но никто им не управляет 

Это не относится к работе синглтонов, пула и т.п. в рамках скрипта.

Т.е. либо порядок инициализации никак не влияет на работу приложения и соответственно свободно масштабируем.
Или если порядок инициализации мешает масштабированию, то в случае с php скорее всего ваш скрипт нерабочий даже в единственном числе (хотя и есть нюансы, например, связанные с эксклюзивным доступом к каким-либо ресурсам системы)


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gold Dragon
Дата 19.3.2013, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Fortop, что в твоём понимании масштабирование..? Просто читаю и чем больше, тем хуже начинаю понимать  smile 

Цитата(Fortop @  19.3.2013,  19:58 Найти цитируемый пост)
хотя и есть нюансы, например, связанные с эксклюзивным доступом к каким-либо ресурсам системы
а доступ к базе данных к этому не относится?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 19.3.2013, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  19.3.2013,  18:58 Найти цитируемый пост)
В php нет тредов.

во-первых, параллельно можно работать кооперативно. во-вторых, речь шла об архитектуре вообще

Цитата(Fortop @  19.3.2013,  18:58 Найти цитируемый пост)
в случае с php скорее всего ваш скрипт нерабочий даже в единственном числе

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

Добавлено через 7 минут и 8 секунд
Цитата(baldina @  19.3.2013,  19:37 Найти цитируемый пост)
параллельно можно работать кооперативно

собственно все даже проще: в достаточно сложном приложении есть немало одинаковых мест, каждое из которых должно выполняться в своём контексте. зависимость от синглтона делает его неотъемлемой частью любого контекста, ввод нового контекста - заплатки и костыли.

глобальный контекст, как правило, существует - это контекст приложения. он (контекст) может быть размазан по файлам, объектам (синглтонам), глобальным переменным. это допустимо, но усложняет внесение изменений, тем более расширение. сбор всего этого добра в одном месте - упрощает. в последнем случае техника синглтона не требуется.
PM MAIL   Вверх
baldina
Дата 19.3.2013, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



итог: создание экземпляра объекта db и т.п. и его предоставление приложению - дело не библиотеки (доступа к бд), а приложения. т.к. библиотека не знает в рамках какой архитектуры она будет работать, а предоставление синглтона на уровне библиотеки (тем более без возможности альтернативного создания объекта) как минимум стимулирует неправильное использование в рамках конкретной архитектуры.

(для простых приложений возможность использования контекста по умолчанию удобно, как это устроено в php_mysql. в процедурном стиле mysqli от этого отказались, т.к. ножик острый)

Это сообщение отредактировал(а) baldina - 19.3.2013, 19:59
PM MAIL   Вверх
Fortop
Дата 19.3.2013, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(Gold Dragon @  19.3.2013,  19:34 Найти цитируемый пост)
Fortop, что в твоём понимании масштабирование..? Просто читаю и чем больше, тем хуже начинаю понимать   

В смысле?
Масштабирование это увеличение используемых для решения задачи ресурсов.

Фокус в том, что для многих языков оно доступно через многозадачность в потоках.
Но php не поддерживает подобное решение (и это во многом его плюс).
Т.е. любое масштабирование задачи на php сводится к запуску дополнительных копий скрипта (на этой машине или многих других машинах - не суть важно).
Поэтому у задач на пхп обычно нет тех проблем, на которые пытался ссылаться baldina.

Т.е. конечный php-скрипт с его пространством имен и есть тот самый Application
В многих других языках все не так просто.

Цитата(Gold Dragon @  19.3.2013,  19:34 Найти цитируемый пост)
а доступ к базе данных к этому не относится?

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

Добавлено через 5 минут и 17 секунд
Цитата(baldina @  19.3.2013,  19:37 Найти цитируемый пост)
в достаточно сложном приложении есть немало одинаковых мест, каждое из которых должно выполняться в своём контексте. зависимость от синглтона делает его неотъемлемой частью любого контекста, ввод нового контекста - заплатки и костыли.

Это все справедливо. В частности поэтому я обратил внимание на то, что класс работы с БД не обязан быть синглтоном smile
Но применительно к области применения php и конкретно соединения с БД - стараются минимизировать их число для приложения.

Поэтому
Цитата(Fortop @  18.3.2013,  14:48 Найти цитируемый пост)
А я думал что он нужен для подключения/адаптера, и то не всегда


Обращаю внимание на фразу "и то не всегда".
Т.е. подключение/адаптер не всегда обязан быть синглтоном smile



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gold Dragon
Дата 19.3.2013, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Цитата(Fortop @  20.3.2013,  00:13 Найти цитируемый пост)
Масштабирование это увеличение используемых для решения задачи ресурсов.
аа, значит правильно понял.. А зачем мне расширять ресурсы??? Я смотрел много движков где это закладывается, но реально это вообще или очень и очень редко используется... Вот для фреймворков может быть это актуально. А вот для движка для моего сайта вообще не нужно... Я написал класс для управления базой что он и делает... А масштабирование это не только для меня увеличение человека/часов, но и выброшенные деньги  smile Так что мера должна быть в желаниях

Цитата(Fortop @  20.3.2013,  00:13 Найти цитируемый пост)
что класс работы с БД не обязан быть синглтоном 
да конечно не обязан(!), но как правило является таковым для простых вопросов (и даже не очень) smile т.к. не нужно ни масштабирование ни множественное подключение



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Fortop
Дата 19.3.2013, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(Gold Dragon @  19.3.2013,  23:36 Найти цитируемый пост)
А зачем мне расширять ресурсы???

Конкретно тебе? Без понятия.

А у нас на 300к уников в сутки виртуалка впала в ступор, пришлось поднимать еще две.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
baldina
Дата 20.3.2013, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Fortop @  19.3.2013,  23:13 Найти цитируемый пост)
Масштабирование это увеличение используемых для решения задачи ресурсов.

почти))) увеличение ресурсов - средство, а не цель. цель - увеличение производительности/числа решаемых задач.
еще можно масштабировать функционал. в последнем случае в применении к пхп уместен пример перерастания микрофреймворка в монстрофреймворк, который будет успешен при удачной архитектуре исходника.

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0861 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.