Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не временной кеш

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
dubasua
Отправлено: 19 Февраля, 2013 - 03:52:25
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Доброго времени суток.
Вот набросал легенький скелет для управления не временным кэшем.
Класс имеет 3 общедоступных метода - set,get,clean.
Метод set, при записи кеша, добавляет информацию о добавлении кеша в его собственный "реестр", так как у одной статьи может быть несколько кешей. При выполнении метода clean, берутся все файлы с кешем и удаляются или очищаются как и сам реестр.

Плюсы - легко отслеживать и чистить кеш по его имени.
Минуса - их больше Улыбка

Посмотрите, скажите будет ли с этого толк, или может бред очередной?
Спойлер (Отобразить)


Пример использование
Спойлер (Отобразить)

(Отредактировано автором: 19 Февраля, 2013 - 04:04:48)

 
 Top
EuGen Администратор
Отправлено: 19 Февраля, 2013 - 08:06:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Минусы? По сути кеш работает с ФС, операции чтения-записи будут дорогими по времени. Кеш нужно хранить в памяти, тем самым он действительно увеличит быстродействие. А кеш-сервис должен быть быстрым, так что не стоит его писать на php. А если так - то проще взять готовый memcached.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dubasua
Отправлено: 19 Февраля, 2013 - 10:01:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




EuGen, спасибо за наводку.
EuGen пишет:
Кеш нужно хранить в памяти

Но для этого нужно дополнительное ПО, чего нет на покупных хостингах.
 
 Top
EuGen Администратор
Отправлено: 19 Февраля, 2013 - 10:09:08
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Значит, нужно выбирать хостинг, где это есть. Реалии таковы, что для решения задачи нужно выбирать ровно те инструменты, которые для нее предназначены. Написать php-демона, который будет работать наподобие memcached-можно. Но скорость такого кеша будет хромать. А кеш нужен почти всегда для ускорения и только для него.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dubasua
Отправлено: 19 Февраля, 2013 - 10:12:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Только что родилась идея записывать кеш в БД, в таблицу типа MEMORY. Это разумно???
 
 Top
EuGen Администратор
Отправлено: 19 Февраля, 2013 - 10:31:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Для кеша - опять же, нет. Потому что - пусть MEMORY-тип таблиц и хорош тем, что хранит данные в ОЗУ, однако же в случае кеша основная задача - сократить обращения к БД (количественно и/или качественно), так как это - сетевой оверхед, время на исполнение запросов и т.п. Разумеется, если речь идет о MEMORY-типе, понятие кеширования со стороны СУБД здесь неприменимо - (таблица и так есть суть набор данных в ОЗУ). Это - никак не влияет на сами данные, но вот кеш индексов оказывается недоступен так же. Поэтому в сравнении с классическими storage-engine этот тип будет иметь преимущество, но все равно - из-за работы с СУБД - для кеша эта идея не кажется хорошей. СУБД ведь часто занята другими важными вещами, которые требуются от неё приложением.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dubasua
Отправлено: 19 Февраля, 2013 - 10:38:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




EuGen, еще раз спасибо за пояснения.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Февраля, 2013 - 18:05:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
не стоит его писать на php. А если так - то проще взять готовый memcached
Я как всегда влезу Закатив глазки
Есть возможность юзать реальную память без мемкешей, которые, к слову, не имеют системы блокировки на время чтения/записи, и постановки в очередь "клиентов", что может вызывать некоторые коллизии при частом обращении к этому кешу.

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

Минус в том, что решение (вроде как) НЕ работает в виндах.
И точно НЕ работает для апачевского модуля.
Зато прекрасно подходит для CLI, CGI и их производных.
Область памяти "жива" до тех пор пока сервер не перезапустят, или пока явно не удалят этот сегмент от рута.
И естессно все копии скриптов могут читать эту память.
По типу как сессии, тока не в файлах, а в памяти.
Дык еще и ОБЩЕЕ хранилище, например как NoSQL решение.
Вобщем применений куча Закатив глазки

Вуаля:

PHP:
скопировать код в буфер обмена
  1. class shared {
  2.  
  3.   private $sem;
  4.   private $shm;
  5.   private $semkey;
  6.   private $shmkey;
  7.  
  8.   public function __construct($semkey, $shmkey, $shmsize) {
  9.  
  10.     $this->semkey = $semkey;
  11.     $this->shmkey = $shmkey;
  12.     $this->shm = shm_attach($this->shmkey, $shmsize, 0660);
  13.  
  14.   }
  15.  
  16.   public function lock() {
  17.     $this->sem = sem_get($this->semkey, 1, 0660);
  18.     sem_acquire($this->sem);
  19.   }
  20.  
  21.   public function unlock() {
  22.     sem_release($this->sem);
  23.   }
  24.  
  25.   public function write($data) {
  26.     shm_put_var($this->shm, $this->shmkey, $data);
  27.   }
  28.  
  29.   public function fswrite($data) {
  30.  
  31.     $this->lock();
  32.     shm_put_var($this->shm, $this->shmkey, $data);
  33.     $this->unlock();
  34.  
  35.   }
  36.  
  37.   public function read() {
  38.     $data = shm_get_var($this->shm, $this->shmkey);
  39.     return $data;
  40.   }
  41.  
  42.   public function fsread() {
  43.  
  44.     $this->lock();
  45.     $data = $this->read();
  46.     $this->unlock();
  47.     return $data;
  48.  
  49.   }
  50.  
  51.   public function clear() {
  52.  
  53.     sem_acquire($this->sem);
  54.     shm_remove($this->shm);
  55.     sem_release($this->sem);
  56.  
  57.   }
  58.  
  59. }

Используем:

PHP:
скопировать код в буфер обмена
  1. $zzz = new shared(1, 1, 1024); // ключики семафора и шары, размер шары в байтах
  2. $zzz->fswrite(array(1, 2, 3, 4, 5, 6)); // массив запишем
  3.  
  4. // далее например очень важно обновить данные
  5. // но расчеты занимают достаточное время
  6. // тогда мы залочим семафор и обновим данные
  7. // в таком случае, даже если кто-то стоит на очереди чтения или записи
  8. // он будет ждать пока мы не закончим работу
  9. $zzz->lock();
  10. // какая-то работа с содержимым
  11. $current = $zzz->read();
  12. array_shift($current);
  13. // записали изменения
  14. $zzz->write($current);
  15. // разлочили
  16. $zzz->unlock();
  17.  

EuGen, если моя информация уже не актуальна, не точна или есть иные пути решения для описываемых задач в моем контексте - подскажите, направьте Закатив глазки
 
 Top
dubasua
Отправлено: 19 Февраля, 2013 - 18:42:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




DeepVarvar, это же круто,
DeepVarvar пишет:
И точно НЕ работает для апачевского модуля

Дык у меня сервак apache на компе, все работает, или я не понял что такое апачевский модуль?
И что такое ключики семафора и шары???
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Февраля, 2013 - 19:11:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




dubasua пишет:
шары
Это шАра, как файловая шАра. А семафоры это доступ к "состояниям" RAM для чтения/записи.
И ключик и шару ты назначаешь сам. Главное чтобы это были целые числа.
Таких областей памяти можно сделать сколько нужно.
И зная ключики можно из другого скрипта получить доступ к этим данным.
Ну если работает, значит хорошо.
 
 Top
dubasua
Отправлено: 19 Февраля, 2013 - 19:19:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Спасибо, буду юзать. Больше радует что может запоминать данные любого типа.
 
 Top
EuGen Администратор
Отправлено: 19 Февраля, 2013 - 20:07:08
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar
Во-первых, нужно shm. Есть не всегда. Во-вторых, кеш в моем понимании - некоторое разделяемое устройство, у которого нет блокировок в принципе. Каждый обратившийся php-процесс имеет свой кеш. Если будет время - представлю что-нибудь в этом роде (соберу из "запчастей", что есть по разным проектам) - но, повторюсь, писать кеш на интерпретируемом языке для реальной боевой high-load-системы - дело не правильное.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Наработки по собственным проектам »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB