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

PHP - bardzo prosta klaca Cache

Object Storage Arubacloud
0 głosów
232 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 220 wizyt
pytanie zadane 13 lutego 2019 w PHP przez niezalogowany
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 17 stycznia 2019 w PHP przez niezalogowany
0 głosów
0 odpowiedzi 138 wizyt
pytanie zadane 5 stycznia 2020 w PHP przez niezalogowany

92,555 zapytań

141,403 odpowiedzi

319,556 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...