Cache pentru paginare


(Gab) #1

Am decis să folosesc https://www.phpfastcache.com/ pentru a reduce interogările cu baza de date.

Codul următor este doar pentru o singură stocare cache

require 'inc/phpfastcache/vendor/autoload.php';
use phpFastCache\CacheManager;
CacheManager::setDefaultConfig(["path" => $_SERVER["DOCUMENT_ROOT"].'/tmp']);
$icache = CacheManager::getInstance('files');
$key = md5($idfile);
$scache = $icache->getItem($key);

$idfile = 10;

if (is_null($scache->get())) {
## extragere detalii fisier din mysql
    $sql = $db->prepare("SELECT * FROM `lista` WHERE `id` = :id");
    $sql->bindParam(':id', $idfile, PDO::PARAM_INT);
    $sql->execute();
    $result = $sql->fetchAll();

foreach($result as $row){
$id      = $row['id'];
$titlu   = $row['titlu'];
$articol = $row['articol'];
$pub     = $row['pub'];
$acc     = $row['acc'];
}

$mydata = [
	'id'      => $id,
	'titlu'   => $titlu,
	'articol' => $articol,
	'pub'     => $pub,
	'acc'     => $acc
];
$scache->set($mydata)->expiresAfter($tf_cache);
$icache->save($scache);
} else {
## extragere detalii fisier din ftp > cache
$unsr = $scache->get();
$id      = $unsr['id'];
$titlu   = $unsr['titlu'];
$articol = $unsr['articol'];
$pub     = $unsr['pub'];
$acc     = $unsr['acc'];
}

Nu știu cât de ok este scris codul, pentru mine merge, m-am luat după exemplele de pe site-ul lor https://www.phpfastcache.com/ dacă e ceva greșit în cod vă rog să îmi spuneți.

Iar eu vreau să pot face asta și pentru lista articolelor cu paginare și nu-mi dau seama cum.


(cosmos) #2

As sparge codul acela in metode specifice care sa faca un singur lucru. Acel select * ... l-as inlocui cu lista de coloane care te intereseaza. As da denumiri mai sugestive. Cel putin atat imi vine pe partea de coding style. Si nici nu este ceva greu de implementat.


(Gab) #3

Am înțeles.

În legătură cu listarea articolelor multiple și paginare mă poate ajuta cineva?


(Razvan Cristian) #4

Nu inteleg din intrebare ce vrei mai exact sa faci…

Cumva sa bagi intr-un cache o lista in care sa tii minte ce articole ai in cache ?!

Sau vrei sa bagi in cache numai pagini specifice? Poti face cate un cache pentru fiecare pagina


(Gab) #5

De exemplu listez ultimele 10 articole adăugate în baza de date, o accesare pe pagina respectivă și să se bage în cache iar după 10 minute să se facă alta interogare la bază, după ce expira cache, bine, asta face deja phpfastcache. Mie îmi trebuie să aflu cum pot sctoca cu acesta articole multiple în cache ca apoi să le listez pe toate în pagină.


(Razvan Cristian) #6
$sql = $db->prepare("SELECT * FROM `lista` WHERE `id` = :id");

Eu is cu .net dar mai sus cand faci selectul nu aduci doar un articol?


(Gab) #7

Ăsta este pentru afișarea articolelor, cel de sus era doar pentru un articol…

$result = $db->query("select * from lista order by pub desc limit 0,25");
foreach($result as $row){
$id      = $row['id'];
$titlu   = $row['titlu'];
$articol = $row['articol'];
$pub     = $row['pub'];
$acc     = $row['acc'];

echo "{$id} - {$titlu} etc...\n";
}

(Cosmin) #8

Gabriela, unde te-ai blocat mai exact? Exemplul de pe site-ul PhpFastCache mi se pare elocvent: (1) verifici daca exista in cache o cheie cu numele dorit, de exemplu “latestArticles”; (2) daca nu exista o setezi pentru un interval de X minute, payload-ul fiind un array tu toate articolele; (3) daca exista preiei array-ul de articole din cheia respectiva.


(Gab) #9

Nu știu cum să fac acel array iar după ce le stochează un interval de timp cum să le preiau din cache să apară ca și cum aș face interogarea normală de la bază


(Eduard-Dan Stanescu) #10

Array-ul este $result. Pe ala il stochezi in cache.


(Gab) #11

Cam așa se salvează un item

a:5:{s:1:"d";a:12:{s:2:"id";i:53951;s:5:"titlu";s:36:"TITLU";s:3:"cid";s:11:"rUU";s:4:"time";i:1886;s:4:"user";s:16:"zzz";s:5:"zz";s:24:"zzz";s:3:"pub";s:19:"2017-01-05 14:42:35";s:3:"acc";i:18;s:4:"date";s:19:"2018-07-24 18:01:54";s:4:"c20t";i:0;s:5:"c";N;s:5:"v";N;}s:1:"g";a:0:{}s:1:"e";O:8:"DateTime":3:{s:4:"date";s:26:"2018-11-14 00:29:43.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:16:"Europe/Bucharest";}s:1:"m";N;s:1:"c";N;}

Dacă salvez multiple aici nu știu cum aș mai extrage eu 15 articole gen …


(Eduard-Dan Stanescu) #12

Mai corectezi tu daca am gresit ceva in cod. :wink:

<?php

    require 'inc/phpfastcache/vendor/autoload.php';
    use phpFastCache\CacheManager;

    CacheManager::setDefaultConfig(["path" => $_SERVER["DOCUMENT_ROOT"].'/tmp']);

    $icache = CacheManager::getInstance('files');
    $key = 'articles_page';
    $scache = $icache->getItem($key);

    if (is_null($scache->get())) {

        ## extragere detalii fisier din mysql
        $sql = $db->query("select * from lista order by pub desc limit 0,25");
        $result = $sql->fetchAll();

        $scache->set($result)->expiresAfter($tf_cache);
        $icache->save($scache);

    } else {

        ## extragere detalii fisier din ftp > cache
        $unsr = $scache->get();

        ## vezi ce iti da si iei cu foreach
        var_dump($unsr);

    }

?>

(Gab) #13

Merge <3
Și dacă îi fac și paginarea, de exemplu, prima pagină afișează cele 25 de articole dar dacă adaug un articol nou, să se actualizeze cache chiar dacă nu a trecut acel timp setat de stocare, cum zici ?


(Eduard-Dan Stanescu) #14

Cand faci insert, update sau delete la articole trebuie sa rulezi din nou acest script de cache. Vezi sa folosesti acelasi $key = 'articles_page';

Pentru paginare gasesti aici si adaptezi la ce ai:


(Gab) #15

Ar trebuii să șterg folderul cache unde se salvează toate paginile atunci când adaug, șterg sau fac actualizare, nu ?


(Eduard-Dan Stanescu) #16

Da, stergi doar fisierele care tin de articole. Nimic altceva !
O sa-si faca iar cache la interogare articol / articole pentru ca nu il mai gaseste.