• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP - bardzo prosta klaca Cache

42 Warsaw Coding Academy
0 głosów
292 wizyt
pytanie zadane 29 sierpnia 2016 w PHP przez esquarial Nowicjusz (150 p.)

Cześć Wszystkim!

Otóż - mam do napisania bardzo prostą klasę cache, z zapisywaniem danych do pliku, i mam ją napisać odnosząc się do wywołania:

require "cache.php";
$cache = new Cache('news');
if($cache->has() == true)
{
    $data = $cache->get();
}
else
{
    $data = md5(rand(0, 9999));
    $cache->set($data);
}
echo $data.'<br/>';
$cache2 = new Cache('clients');
if($cache2->has() == true)
{
    $data = $cache2->get();
}
else
{
    $data = md5(rand(0, 9999));

    $cache2->set($data);
}
echo $data."<br/>";

Konstruktor ma przyjmować jako argument nazwę klucza tablicy asocjacyjnej do której zostanie zapisany cach, funkcja has()  sprawdza dla danego klucza czy istnieją już jakieś dane w tablicy, jeżeli istnieją to je wyciągnąć funkcją get(), a jeżeli nie istnieją to je wygenerować funkcją set() i zapisać do tablicy pod danym kluczem. I tutaj leży problem a mianowicie - przy tworzeniu drugiego obiektu klasy cache do tablicy nie zostaje dodany nowy index, tylko tak jakby nadpisuję się index pierwszego obiektu indexem drugiego i tak za każdym odświeżeniem strony. Moje pytanie - jak zmodyfikować kod żeby dodawać do tablicy nowy index dla każdego nowo utworzonego obiektu. A oto ciało klasy:

class Cache
{
    private $name = '';
    private $path = 'cache.txt';
    private $data = [];

    public function __construct($name)
    {
        $this->name = $name;
    }
    public function has()
    {
        if((filesize($this->path))!=0)
        {
            $out = file_get_contents($this->path);
            $outun = unserialize($out);
            if(!array_key_exists($this->name,$outun))
            {
                return false;
            }else return true;
        }else return false;
    }
    public function get()
    {
        if(!array_key_exists($this->name, $this->data))
        {
            return false;
        }
        else
        {
            $out = file_get_contents($this->path);
            $outun = unserialize($out);
            $this->data[$this->name] = $outun[$this->name];
            return $this->data[$this->name];
        }
    }
    public function set($data)
    {
            $this->data[$this->name] = $data;
            file_put_contents($this->path, serialize($this->data));
    }
    public function clear()
    {
        if(file_exists($this->path))
        {
            unlink($this->path);
        }
        else
            {
                echo 'Plik nie istnieje';
            }
    }
}

1 odpowiedź

+1 głos
odpowiedź 29 sierpnia 2016 przez piotrek Nowicjusz (220 p.)
Funkcja file_put_contents() bez flagi FILE_APPEND, nadpisze Ci plik i dla tego tak się dzieje.
komentarz 29 sierpnia 2016 przez esquarial Nowicjusz (150 p.)
Otworzyłeś Mi oczy :)

Mam jeszcze jedno pytanie, a mianowicie - teraz przy wywoływaniu drugiego obiektu klasy cache za każdym odświeżeniem strony, do tablicy dodaje się kolejny rekord, a wyświetla się ten kolejny wygenerowany, jak temu zapobiec.

Dzięki za odpowiedź.
2
komentarz 30 sierpnia 2016 przez piotrek Nowicjusz (220 p.)
Według mnie najlepiej będzie Ci zrobić tak że będziesz mieć folder cache/ i tak będą pliki news.txt, clients.txt itd

Podobne pytania

0 głosów
2 odpowiedzi 287 wizyt
pytanie zadane 13 lutego 2019 w PHP przez niezalogowany
0 głosów
1 odpowiedź 251 wizyt
pytanie zadane 17 stycznia 2019 w PHP przez niezalogowany
0 głosów
0 odpowiedzi 173 wizyt
pytanie zadane 5 stycznia 2020 w PHP przez niezalogowany

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,726 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...