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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Срок жизни синглтона, подробности внтури 
:(
    Опции темы
v00d00
Дата 18.9.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени

Есть класс

Код

class Settings {

    private static $instance;
    private $settings;    
   
    private function __construct() {
        $this->settings = parse_ini_file("settings.ini", true);
    }
   
    public static function getInstance() {
        if(! isset(self::$instance)) {
            self::$instance = new Settings();           
        }
        return self::$instance;
    }
   
    public function __get($setting) {
        if(array_key_exists($setting, $this->settings)) {
            return $this->settings[$setting];
        } else {
            foreach($this->settings as $section) {
                if(array_key_exists($setting, $section)) {
                    return $section[$setting];
                }
            }
        }
    }
}


Как видим это синглтон. 

Используется он так:

Код

require_once('/service/InitConnection.php');    
$stns = Settings::getInstance();
$user=$stns->user;
$password=$stns->password;
$database=$stns->database;
$localhost=$stns->localhost;


Вопрос: как долго на вебсервере будет висеть инстанс класса? 

PM MAIL   Вверх
NewDima
Дата 18.9.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Как только скрипт закончит работу, сборщик мусора выкинет инстанс
PM ICQ   Вверх
Simpliest
Дата 18.9.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v00d00 @  18.9.2009,  14:47 Найти цитируемый пост)
Вопрос: как долго на вебсервере будет висеть инстанс класса? 

Если нужно долго висеть, то возможно подойдет паттерн Registry

А в ZF можно посмотреть на его имплеменатцию http://framework.zend.com/manual/en/zend.registry.html


--------------------
user posted image
PM   Вверх
Ипатьев
Дата 18.9.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 28
Всего: 37



Вот только в случае с коннектом к бд никакой паттерн не поможет.
Подключаться придется заново в любом случае
PM MAIL   Вверх
v00d00
Дата 18.9.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А по какому принципу действует сборщик?

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

Или парсер PHP будет каждый раз открывать файл через
Код

require_once('/service/InitConnection.php');    

и создавать новый инстанс?
А старый следовательно удалять?

Добавлено через 4 минуты
Кстати класс этот обертка вокруг INI файла(как вы видели). Просто хранит в себе считанные данные. 

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

Это сообщение отредактировал(а) v00d00 - 18.9.2009, 15:32
PM MAIL   Вверх
NewDima
Дата 18.9.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



v00d00, хранит все инстансы только во время генерации ответа на запрос. Паттерн синглетон не предзназначен для передачи инстанса между сессиями запросов. Как только сервер сгенерировал ответ, скрипт отработал, сборщик мусора удалит из памяти все ссылки на синглетон и сам инстанс
PM ICQ   Вверх
v00d00
Дата 18.9.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пичаль. Сохраню настройки в пхп файл и буду инклюдить его как есть...
PM MAIL   Вверх
NewDima
Дата 18.9.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



v00d00, есть другой вариант, perl и java (на сколько я знаю) поступают наоборот, именно так как тебе надо  smile

Добавлено через 54 секунды
v00d00, если уж так надо сохранять синглетон - var_export в помощь
PM ICQ   Вверх
Simpliest
Дата 18.9.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v00d00 @  18.9.2009,  15:31 Найти цитируемый пост)
Кстати класс этот обертка вокруг INI файла(как вы видели). Просто хранит в себе считанные данные. 

Собственно вопрос и возник потому что использование синглтонов в PHP кажется сомнительным удовольствием

Singletone гарантирует что при работе скрипта будет только 1 инстанс класса. Но скрипт у тебя завершается отдав данные, 
а работа приложения еще не завершена.

Это особенность веб-приложений - они растянуты/разорваны в пространстве и времени. Т.е., когда произойдет следующий вызов скрипта(обращение к конкретному url) и какой именно скрипт будет вызван, мы не можем сказать со 100%й вероятностью.

Поэтому для корректной работы нам надо хранить "состояния" приложения.

Вот для хранения состояний между запросами/обращениями и используется Registry (в который ты, кстати, можешь сохранить и свой инстанс Singletone)

P.S. Состояния можно хранить и в URL, и в hidden полях на страницах, и в базе/файле на сервере - это уже особенности реализации

Это сообщение отредактировал(а) Simpliest - 18.9.2009, 16:16


--------------------
user posted image
PM   Вверх
NewDima
Дата 18.9.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Цитата(Simpliest @ 18.9.2009,  23:16)
Вот для хранения состояний между запросами/обращениями и используется Registry (в который ты, кстати, можешь сохранить и свой инстанс Singletone)

Для меня откровение

Добавлено через 6 минут и 6 секунд
И по-моему не правда
Перечитал еще раз полность о ZendRegistry, ничего подобного не нашел, только это (что в начале):
Цитата

A registry is a container for storing objects and values in the application space. By storing the value in a registry, the same object is always available throughout your application. This mechanism is an alternative to using global storage

PM ICQ   Вверх
Simpliest
Дата 18.9.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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





--------------------
user posted image
PM   Вверх
v00d00
Дата 18.9.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На самом деле просто хотелось применить паттерн на практике. Проблема решается намного проще (и по реализации и по скорости выполнения) инклудом настроек. 

Офтопик: Registry  - это часть поставки Зенда? ( как тогда там реализован хранение данных между ответами ?)
PM MAIL   Вверх
NewDima
Дата 18.9.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Никак, выражаясь языком Simpliest, это глупость
PM ICQ   Вверх
Simpliest
Дата 18.9.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(v00d00 @  18.9.2009,  16:26 Найти цитируемый пост)
Registry  - это часть поставки Зенда? ( как тогда там реализован хранение данных между ответами ?) 

Registry - это паттерн. Он ничей smile

Я просто дал, как образец, ссылку на его реализацию в ZF http://framework.zend.com/manual/en/zend.registry.html 



--------------------
user posted image
PM   Вверх
IZ@TOP
Дата 18.9.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата(NewDima @  18.9.2009,  17:19 Найти цитируемый пост)
Для меня откровение 

Для меня тоже. Не вижу, что бы в Zend_Registry где-то сохранялось состояние объекта между сессиями и потом ресторилось. Да и нет там такого.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




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


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

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