Newsy - gotowiec

2012-08-06 19:16:37 Post #1 gość_mimol

 
Od niedawna uczę się pisać obiektowo, zrobiłem system newsów, a że znalazłem ładną klasę cache to spróbowałem to wdrożyć.

Proszę o opinie na temat moich klas do zarządzania newsami(bardzo podstawowe funkcje)
Najbardziej zależy mi ,abyś wgłębił się w funkcje fetch-> czy jest ona poprawnie zrobiona.
Dzięki za wszystie uwagi
<?php
require('Cache.class.php');
require('drivers/CacheFileDriver.class.php');

class Newsy{
    private $db;
    private $Newsy;
    private $cache;
    public function __construct(){
        try{
            $this->db = new PDO('mysql:host=localhost;dbname=newsy', 'root', '' );
            echo 'Poł±czenie nawi±zane!';
        }catch(PDOException $e){
            echo 'Poł±czenie nie mogło zostać utworzone:<br> ' . $e->getMessage();
        }
        //add cache
        $this->cache = new Cache();
        $this->cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));
        $this->cache->AddGroup('newsy/@podkat', array(
    		'lifetime'=>300, 
    		'driver'=>'fileDriver'));
    }
    public function add($News){
        $sql = 'INSERT INTO news (tytul ,tresc) VALUES (:tytul,:tresc)';
        try{
            $q=$this->db->prepare($sql);
            $q->execute(array(
                ':tytul'=>$News->tytul,
                ':tresc'=>$News->tresc
            ));
            echo 'dodano';
        }catch(PDOException $e){
            echo 'Nie moge dodac ' . $e->getMessage();
        }
    }
    public function fetch($id=0,$limit=0){
        /****FETCH ****/
        $id=(int)$id;
        $limit=(int)$limit;
        $sql = 'SELECT * FROM news';
        if($id>0){
            $sql .= ' WHERE id ='.$id;
        }
        if($limit>0){
            $sql .= ' LIMIT '.$limit;
        }
        try{
            $q=$this->db->prepare($sql);
            $q->execute();
            $result = $q->fetchAll();
            foreach($result as $r){
                $val = $this->cache->Get('newsy/news_'.$r['id'],'newsy/@podkat');
                	if (is_null($val)){
                		$val = new News($r);
                		$res = $this->cache->Put('newsy/news_'.$r['id'], $val,'newsy/@podkat');
                		if ($res === false)
                			echo 'Niewlozono obiektu do cache:<br />';
                		else
                			echo 'Wlozono obiekt do cache: ';
                	}else {
                		echo 'Pobrano obiekt z cache:  <br />';	
                	}
                $this->Newsy[]=$val;                        
            }
        }catch(PDOException $e){
            echo 'Nie moge pobrac danych ' . $e->getMessage();
        }
    }
    public function show(){
        if(count($this->Newsy)>1){
            foreach ($this->Newsy as $News){
                echo $News;
            }
        }else{
            echo $this->Newsy[0];
        }
    }
}
class News{
    private $id;
    private $tytul;
    private $tresc;
    public function __construct($data){
        if(isset($data['id'])){
            $this->id = $data['id'];
        }else
            $this->id = NULL;
      $this->tytul = $data['tytul'];
      $this->tresc = $data['tresc'];
   }
   public function __get($name){
      return $this->$name;
   }
   public function __toString(){
        return 'News <b>#'.$this->id.'</b> Tytul: <b>'.$this->tytul.'</b> Tresc:<b>'.$this->tresc.'</b><br>';
   } 
}
$Newsy = new Newsy();
$Newsy->fetch(0,4);
$Newsy->show();
?>

Wsyzstie pliki
https://www.sugarsync.com/pf/D6781669_95_8752727601

2012-08-07 08:41:31 Post #2 nospor

 
Do cache powinieneś wkładać cały wynik funkcji fetch() a nie pojedyńcze newsy.
W tej chwili cache nie spełnia u ciebie żadnej roli, bo ty i tak za każdym razem lecisz do bazy - totalnie bez sensu.
Rola cache jest taka by jak coś jest w cache, to nie trzeba już było do tej bazy lecieć - a ty czy jest coś w cache czy nie ma to i tak do bazy lecisz.

No i takie rzeczy jak to:
echo 'Niewlozono obiektu do cache:<br />';
to naprawdę można wywalić

2012-08-07 10:30:16 Post #3 gość_mimol

 
rzeczywiscie, jak będę miał trochę czasu to spróbuję to poprawić.
Ale ze mnie tłuk, że tego nie zauważyłem

2012-08-10 15:26:32 Post #4 gość_mimol

 
Już poprawiona wersja razem z Twoim pagerem.
Jednak nasuwa mi się kilka pytań.
1)Pobierając 5 newsów, sprawdzam w funkcji check_cache czy są one zapisane.
Co jeśli np newsa o id=2 nie będzie?? Wtedy zawsze będzie próbował je pobrać z bazy a nie z cacha. Czy jest jakiś sposób by temu zaradzić. Można by sprawdzać których id nie ma w bazie. Jednak czy to ma sens? Jak to powinno być profesjonalnie rozwiązane
2)Zrobiłem sobie testy (Stary laptop) i okazało się, że około 2-3x szybciej jest pobierać wyniki bez cacha. Wydaje mi się, że bazy danych powstały po to by nie operować na plikach. Czy rzeczywiście jeśli byłby większy ruch strona wczytywała by dane szybciej z pliku niż z bazy?

<?php
require_once('Cache.class.php');
require_once('drivers/CacheFileDriver.class.php');
require_once('Pager.class.php');
class Newsy{
private $db;
private $Newsy;
private $cache;
public function __construct(){
try{
$this->db = new PDO('mysql:host=localhost;dbname=newsy', 'root', '' );
}catch(PDOException $e){
echo 'Poł±czenie nie mogło zostać utworzone:<br> ' . $e->getMessage();
}
//add cache
$this->cache = new Cache();
$this->cache->AddDriver('fileDriver',new CacheFileDriver('Cache'));
$this->cache->AddGroup('newsy/@podkat', array(
'lifetime'=>300,
'driver'=>'fileDriver'));
}
public function add($News){
$sql = 'INSERT INTO news (tytul ,tresc) VALUES (:tytul,:tresc)';
try{
$q=$this->db->prepare($sql);
$q->execute(array(
':tytul'=>$News->tytul,
':tresc'=>$News->tresc
));
echo 'Dodano!';
}catch(PDOException $e){
echo 'Nie moge dodac ' . $e->getMessage();
}
}
private function check_cache($limit){
for($i=1;$i<=$limit;$i++){
$val = $this->cache->Get('newsy/news_'.$i,'newsy/@podkat');
if (is_null($val)){
return 0;
}
}
//create objects
for($i=1;$i<=$limit;$i++){
$val = $this->cache->Get('newsy/news_'.$i,'newsy/@podkat');
$this->Newsy[]=$val;
}
return 1;
}
public function fetch($id=0,$limit=0){
/****FETCH ****/

$id=(int)$id;
$limit=(int)$limit;
$sql = 'SELECT * FROM news';
if($id>0){
$sql .= ' WHERE id ='.$id;
$val = $this->cache->Get('newsy/news_'.$r['id'],'newsy/@podkat');
if (is_null($val)){
try{
$q=$this->db->prepare($sql);
$q->execute();
$result = $q->fetch();
if($result){
$val = new News($result);
$res = $this->cache->Put('newsy/news_'.$r['id'], $val,'newsy/@podkat');
if ($res === false)
echo 'Niewlozono obiektu do cache:<br />';
}else{
echo 'Brak newsa o podanym id<br />';
}
}
catch (Exception $e) {
echo $e->getMessage();
}
}
$this->Newsy[]=$val;
}else{
$sql.= ' LIMIT '.$limit;
if($this->check_cache($limit)===0){
try{
$q=$this->db->prepare($sql);
$q->execute();
$result = $q->fetchAll();
foreach($result as $r){
$val = new News($r);
$res = $this->cache->Put('newsy/news_'.$r['id'], $val,'newsy/@podkat');
if ($res === false)
echo 'Niewlozono obiektu do cache:<br />';
$this->Newsy[]=$val;
}
}catch (Exception $e) {
echo $e->getMessage();
}
}
}
}
public function show(){
try{
$pager = new Pager('p','',true);
$pager->SetTotalRecords(count($this->Newsy));
$pager->Make(true);
$pag = $pager->Render();
$start = $pager->GetIndexRecordStart();
$end = $pager->GetIndexRecordEnd();
}
catch (Exception $e) {
echo $e->getMessage();
}
for($i=$start;$i<=$end;$i++){
echo $this->Newsy[$i];
}
echo $pag;
}
}
class News{
private $id;
private $tytul;
private $tresc;
public function __construct($data){
if(isset($data['id'])){
$this->id = $data['id'];
}else
$this->id = NULL;
$this->tytul = $data['tytul'];
$this->tresc = $data['tresc'];
}
public function __get($name){
return $this->$name;
}
public function __toString(){
return 'News <b>#'.$this->id.'</b> Tytul: <b>'.$this->tytul.'</b> Tresc:<b>'.$this->tresc.'</b><br>';
}
}
$Newsy = new Newsy();
$Newsy->fetch(2,0);
$Newsy->show();
?>

2012-08-10 15:45:33 Post #5 nospor

 
Pisałem ci, że do cache masz wkładać cały zestaw newsów a nie każdy news z osobna.
Jak chcesz pobrać 5 ostatni newsów (np. na stronę główną) to te 5 ostatnich newsów ma być w jednym cache a nie każdy z pięciu newsów osobno i każdego z osobna pobierasz z cache.

Cache nie służy do zapisywania na dysku całej bazy, tylko wybrane jej części, które są używane często

2012-08-11 08:09:07 Post #6 gość_mimol

 
Czy w funkcji fetch(0,5) Mam do cache zapisać wszystkie newsy (i potem wyświetlić tylko te 5) czy zapisać tylko 5 newsów?

2012-08-12 18:43:00 Post #7 nospor

 
No masz w cache (w jednym cache a nie w pięciu cache) zapisać 5 ostatnich newsów.

Odpowiedz

Ostatnio komentowane

  1. Mysql - FAQ Paweł
  2. Pager 2.5.1 oraz EPa... Na szybko2
  3. Pager 2.5.1 oraz EPa... Sławek
  4. Mysql - FAQ Piotr
  5. Liczba dni roboczych Na szybko2
  6. Liczba dni roboczych Naszybko
  7. Klasa widoku nospor

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer