Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> CacheSystem, Chciałbym abyście ocenili mój Cache System
Fifi209
post
Post #1





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


  1. <?php
  2. # autor: fifi209 (Fast)
  3.    # class: CacheSystem
  4.    # version: 1.02
  5.  
  6.    class CacheSystem {
  7.    
  8.        const COMPRESSION_NONE=0;
  9.        const COMPRESSION_BZIP2=1;
  10.        protected $dir;
  11.        private $compression;
  12.        
  13.        public function __construct($dir, $compression) {
  14.            if (@opendir($dir)) {
  15.                $this->dir = $dir;
  16.                switch ($compression) {
  17.                    case self::COMPRESSION_NONE:
  18.                        $this->compression = false;
  19.                        break;
  20.                    case self::COMPRESSION_BZIP2:
  21.                        $this->compression = true;
  22.                        break;
  23.                }
  24.            }else{
  25.                echo 'Podany katalog nie istnieje lub nie masz praw do jego otworzenia.';
  26.            }
  27.        }
  28.        
  29.        public function __get($cacheFile) {
  30.            if (file_exists($this->dir.'/'.$cacheFile.'.cache')) {
  31.                if ($this->compression == false) {
  32.                    return file_get_contents($this->dir.'/'.$cacheFile.'.cache');
  33.                }else{
  34.                    $handle = bzopen($this->dir.'/'.$cacheFile.'.cache', 'r');
  35.                    $text = bzread($handle, filesize($this->dir.'/'.$cacheFile.'.cache'));
  36.                    bzclose($handle);
  37.                    return $text;
  38.                }
  39.            }else{
  40.                return false;
  41.            }
  42.        }
  43.        
  44.        public function __set($cacheFile, $value) {
  45.            if ($this->compression == false) {
  46.                file_put_contents($this->dir.'/'.$cacheFile.'.cache', $value);
  47.                return true;
  48.            }else{
  49.                $handle = bzopen($this->dir.'/'.$cacheFile.'.cache', 'w');
  50.                bzwrite($handle, $value);
  51.                bzclose($handle);
  52.                return true;
  53.            }
  54.        }
  55.        
  56.        public function destroy($cacheFile) {
  57.            if ($this->$cacheFile != false) {
  58.                unlink($this->dir.'/'.$cacheFile.'.cache');
  59.                return true;
  60.            }else{
  61.                return false;
  62.            }
  63.        }
  64.        
  65.    }
  66. ?>


Napisałem ją dla siebie, ale może się komuś przyda. A teraz prosiłbym o jakieś uwagi dot. kodu, tj. co by można zmienić, zrobić inaczej.
Wydaje mi się, że jak na tą prostotę funkcjonalność jest wystarczająca. (przynajmniej dla mnie)

Użycie przykładowe:

Najpierw konstruktor:
  1. <?php
  2. $cache = new CacheSystem('cache', CacheSystem::COMPRESSION_NONE);
  3. ?>


Parametr pierwszy - ścieżka do folderu cache
Parametr drugi - używana kompresja (w tym wypadku brak, lecz "NONE" można zastąpić "BZIP2")

a) Dodawanie cache/Zmienianie jego wartości (konstruktor pomijam)
  1. <?php
  2. $cache->podstrona = 'Jakas wartosc';
  3. ?>


(IMG:http://forum.php.pl/style_emoticons/default/cool.gif) Odczyt cache
  1. <?php
  2. echo $cache->podstrona;
  3. ?>


c) Usuwanie cache
  1. <?php
  2. $cache->destroy('podstrona');
  3. ?>


podstrona -> nazwa pliku cache (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował fifi209 14.06.2009, 22:54:36
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kamil_biela
post
Post #2





Grupa: Zarejestrowani
Postów: 31
Pomógł: 7
Dołączył: 14.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


osobiście wolalbym pobierać/ustawiać zawartość keszu przez settera/gettera - wtedy w podpowiadaniu składni wyskakują odpowiednie metody.

Przydałoby się też keszowanie nagłówków strony.

I nie pogardziłbym możliwością ustawiania czasu życia.

edit:

hmm... i nigdzie nie widzę phpdoc'a

Ten post edytował kamil_biela 14.06.2009, 00:52:28
Go to the top of the page
+Quote Post
Fifi209
post
Post #3





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(kamil_biela @ 14.06.2009, 01:50:17 ) *
osobiście wolalbym pobierać/ustawiać zawartość keszu przez settera/gettera - wtedy w podpowiadaniu składni wyskakują odpowiednie metody.

Przydałoby się też keszowanie nagłówków strony.

I nie pogardziłbym możliwością ustawiania czasu życia.

edit:

hmm... i nigdzie nie widzę phpdoc'a



Co za problem zrobić cache nagłówków i zapisać np. jako headers ?
Czas życia? Przecież jak np. aktualizujesz coś w bazie to tylko zmieniasz zawartość cache, a jeżeli usuwasz coś z bazy to i wykonujesz destroy() dla danego pliku cache.

Czas życia - możesz dorobić przez cron'a (sprawdź kiedy plik został utworzony i po x czasie możesz go usuwać) (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) [bez sensu]
Go to the top of the page
+Quote Post
kamil_biela
post
Post #4





Grupa: Zarejestrowani
Postów: 31
Pomógł: 7
Dołączył: 14.06.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(fifi209 @ 14.06.2009, 02:06:46 ) *
Co za problem zrobić cache nagłówków i zapisać np. jako headers ?


Taa... żaden. Cache_Lite lepsze. Tylko mi w nim brakuje keszowania nagłówków.

Cytat(fifi209 @ 14.06.2009, 02:06:46 ) *
Czas życia? Przecież jak np. aktualizujesz coś w bazie to tylko zmieniasz zawartość cache, a jeżeli usuwasz coś z bazy to i wykonujesz destroy() dla danego pliku cache.

Czas życia - możesz dorobić przez cron'a (sprawdź kiedy plik został utworzony i po x czasie możesz go usuwać) (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) [bez sensu]


Heh, tak powiedzmy że zmieniam coś 20 razy na sekundę w bazie danych i za każdym razę robię destroy?
Z tym cronem to nie przesadzaj, z natury człowiek leniwy jestem - mam sobie jeszcze zaprzątać głowę cronem, jakbym mógł jedną opcję ustawić?

Bez obrazy, ale czy nie popadłeś w samozachwyt nad własnym kodem? Chciałeś propozycje, to masz.

Aha, ja bym zwracał null'a zamiast false. Ale to tylko takie już moje bajdurzenie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Fifi209
post
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(kamil_biela @ 14.06.2009, 02:18:10 ) *
Heh, tak powiedzmy że zmieniam coś 20 razy na sekundę w bazie danych i za każdym razę robię destroy?
Z tym cronem to nie przesadzaj, z natury człowiek leniwy jestem - mam sobie jeszcze zaprzątać głowę cronem, jakbym mógł jedną opcję ustawić?

Bez obrazy, ale czy nie popadłeś w samozachwyt nad własnym kodem? Chciałeś propozycje, to masz.

Aha, ja bym zwracał null'a zamiast false. Ale to tylko takie już moje bajdurzenie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)


Dobrze wiesz, że nie zmieniasz nic 20 razy na sekundę bo by Ci ta baza padła chyba a limity na rok byś wyczerpał w kilka dni. (chyba, że miałbyś swój serwer) Poza tym gdy edytujesz dane, to nie musisz robić destroy.

Nad czasem życia pomyśle.

Nie nie popadłem w samozachwyt.

Zwracać null a nie false, powiedz mi jaką widzisz różnicę? Mi wydawało się wygodniej dostać bool(true or false)

Ja cache pierwszy raz użyłem, gdy na stronie musiałem wykonać kilkanaście zapytać do mysql, czas wykonywania tego skryptu to było od 0.8sek do 2sek zależnie od wolnego czasu procesora. Dane były aktualizowane raz na dzień, po dodaniu cache czas wczytywania strony spadł na: 0,00093sek.

P.S. Nikt mądry raczej nie użyje cache, przy takim wypadku jak Ty podałeś - już lepiej zoptymalizować bazę i zapytania i pobierać na bieżąco.

Na życzenie dorobiony czas życia cache:

Tabela sql:
  1. CREATE TABLE `cache` (
  2. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(25) NOT NULL,
  4. `time` int(10) UNSIGNED NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MEMORY DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;


  1. <?php
  2. # autor: fifi209 (Fast)
  3.    # class: CacheSystemDB
  4.    # version: 1.0
  5.  
  6.    class CacheSystemDB extends CacheSystem {
  7.        
  8.        private $pdo;
  9.  
  10.        public function setDatabase(PDO $handle) {
  11.            $this->pdo = $handle;
  12.        }
  13.        
  14.        public function setTimeLife($cacheFile, $time) {
  15.            if ($this->$cacheFile != false) {
  16.                $result = $this->pdo->prepare('SELECT `id` FROM `cache` WHERE `name` = :name LIMIT 1');
  17.                $result->bindValue(':name', $cacheFile, PDO::PARAM_STR);
  18.                $result->execute();
  19.                
  20.                if ($result->rowCount() > 0) {
  21.                    $result->closeCursor();
  22.                    $result = $this->pdo->prepare('UPDATE `cache` SET `time` = :time WHERE `name` = :name LIMIT 1');
  23.                    
  24.                }else{
  25.                    $result->closeCursor();
  26.                    $result = $this->pdo->prepare('INSERT INTO `cache` (`id`, `name`, `time`) VALUES(null, :name, :time)');
  27.                }
  28.                
  29.                $result->bindValue(':name', $cacheFile, PDO::PARAM_STR);
  30.                $result->bindValue(':time', $time+time(), PDO::PARAM_INT);
  31.                $result->execute();
  32.                $result->closeCursor();
  33.                return true;
  34.            }else{
  35.                return false;
  36.            }
  37.        }
  38.        
  39.        public function destroyDie() {
  40.            $result = $this->pdo->query('SELECT * FROM `cache` WHERE `time` < '.time());
  41.            if ($result->rowCount() > 0) {
  42.                foreach ($result as $row) {
  43.                    $this->destroy($row['name']);
  44.                }
  45.                $del = $this->pdo->query('DELETE FROM `cache` WHERE `time` < '.time());
  46.                $del->closeCursor();
  47.            }
  48.            $result->closeCursor();
  49.        }    
  50.        
  51.    }
  52. ?>


Jeżeli trzeba to dodam później opis jak tego używać. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował fifi209 14.06.2009, 10:00:00
Go to the top of the page
+Quote Post

Posty w temacie
- fifi209   CacheSystem   13.06.2009, 22:58:36
- - Moli   Zły dział. Jest dział do ocen. A co jak będę chci...   13.06.2009, 23:06:03
|- - fifi209   Cytat(Moli @ 14.06.2009, 00:06:03 ) Z...   13.06.2009, 23:11:50
- - kamil_biela   osobiście wolalbym pobierać/ustawia...   14.06.2009, 00:50:17
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 01:50...   14.06.2009, 01:06:46
|- - kamil_biela   Cytat(fifi209 @ 14.06.2009, 02:06:46 ...   14.06.2009, 01:18:10
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 02:18...   14.06.2009, 10:01:44
- - kamil_biela   Kesz który wymaga połączenia z bazą danych? Oczywi...   14.06.2009, 11:27:08
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 12:27...   14.06.2009, 11:32:24
|- - kamil_biela   Cytat(fifi209 @ 14.06.2009, 12:32:24 ...   14.06.2009, 11:45:57
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 12:45...   14.06.2009, 11:50:12
|- - kamil_biela   Cytat(fifi209 @ 14.06.2009, 12:50:12 ...   14.06.2009, 11:54:43
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 12:54...   14.06.2009, 12:09:04
- - kamil_biela   Trochę sprzeczne jest ze sobą to co mówisz. Z jedn...   14.06.2009, 12:12:54
- - fifi209   Cytat(kamil_biela @ 14.06.2009, 13:12...   14.06.2009, 22:08:47
- - kamil_biela   setXMLPath, to IMO powinno być w konstruktorze, z ...   14.06.2009, 22:23:31
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 23:23...   14.06.2009, 22:34:21
|- - kamil_biela   Cytat(fifi209 @ 14.06.2009, 23:34:21 ...   14.06.2009, 22:43:26
|- - fifi209   Cytat(kamil_biela @ 14.06.2009, 23:43...   14.06.2009, 22:56:27
- - erix   Cache'owanie + kompresja = zuo Poza tym, nie ...   15.06.2009, 10:01:28


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 19:54