Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Вопрос по __construct() и __destruct() при разработке


kagan

Recommended Posts

Добрый вечер.

 

Подскажите, если я работаю с кешем.

Мне нужно его один раз дернуть и потом сохранить при изменениях.

 

Через конструктор я его получаю, сохраняю в локальную переменную внутри класса.

После, делаю разные манипуляции.

Сохраняю обратно в кеш при __destruct().

 

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

Надіслати
Поділитися на інших сайтах

 

 

сохранить при изменениях.

 

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

 

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

 

А так, да, можно использовать кэширование в конструкторах и деструкторах.

Змінено користувачем halfhope
  • +1 1
Надіслати
Поділитися на інших сайтах

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

 

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

 

А так, да, можно использовать кэширование в конструкторах и деструкторах.

 

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

 

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

 

Хостинг не позволяет устанавливать доп. библиотеки к PHP. (т.е. Morpher.so отпадает). Пробовал подключать доп. классы для работы со склонениями, но ничего нормально не склонялось (видимо из-за отсутсвия нормальных словарей).

 

После, нашел сервис который может склонять через API, и возвращает обратные данные в формате json. Дальше с ним и работал.

 

Мне нужно было сделать допил для плагина массовой генерации мета-тегов (типа title, description, h1, и т.д.). Решение сделал таким:

class ModelModuleSeogen extends Model {
public function __construct($registry) {
  parent::__construct($registry);
  require_once(DIR_SYSTEM . 'helper/morphy.php');
}

// Для получения слов в род. падеже
public function getStringInRodPadeg($string) {
  // Сервис не доступен
  if (is_null(checkServiceStatusForPadeg()))
   return $string;

  $cache_name = 'declensions.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id');
 
  $declensions = $this->cache->get($cache_name);

  // Кеш не создан
  if (!$declensions)
   $declensions = array();

  // Если перевод в кеше не найден, добавляем его
  if (!array_key_exists($string, $declensions)) {
   $declensions[$string] = getRodPadeg($string);
   $this->cache->set($cache_name, $declensions);
  }
 
  return $declensions[$string];
}

public function func1() {
  echo $this->getStringInRodPadeg('котлы');
}

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

private $declensions = array();
private $cache_name;

public function __construct($registry) {
	parent::__construct($registry);

	$this->cache_name = 'declensions.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id');
	$this->declensions = $this->cache->get($this->cache_name);

	require_once(DIR_SYSTEM . 'helper/morphy.php');
}

public function __destruct($registry) {
	$this->cache->set($this->сache_name, $this->declensions);

	parent::__destruct($registry);
}

// Для получения слов в род. падеже
public function getStringInRodPadeg($string){
	// Сервис не доступен
	if (is_null(checkServiceStatusForPadeg()))
		return $string;

	// Кеш не создан
	if (!$this->declensions)
		$this->declensions = array();

	// Если перевод в кеше не найден, добавляем его
	if (!array_key_exists($string, $this->declensions)) {
		$this->declensions[$string] = getRodPadeg($string);
	}
	
	return $this->declensions[$string];
}

Думаю, так будет работать более быстрее.  :-)

Надіслати
Поділитися на інших сайтах

МаМа дорогая!!!!

 

getStringInRodPadeg

 

И так будет под каждый падеж?

 

Шутите?) 

Нет, мне просто нужно было только в родительном падеже (другие не нужны).

Надіслати
Поділитися на інших сайтах

ради родительного падежа такое мутить
А че? офлайновые библиотеки морфуса уже не справляются?

Надіслати
Поділитися на інших сайтах

ради родительного падежа такое мутить

А че? офлайновые библиотеки морфуса уже не справляются?

 

Ну да, пришлось)

 

Тестил одну оффлайновую, не справилась.

Если есть годный линк, буду благодарен.

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.