Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dileme oko kesiranja upita

[es] :: PHP :: Dileme oko kesiranja upita

[ Pregleda: 1605 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

hellofanta
Beograd

Član broj: 264949
Poruke: 35
*.dynamic.isp.telekom.rs.



Profil

icon Dileme oko kesiranja upita02.01.2013. u 21:25 - pre 136 meseci
Dobra vam noc dobri ljudi, zelim vam puno zdravlje i jos vise redova koda u 2013. godini.
Imam dve dileme pa bih vas zamolio za jedan dobar savet.
Muci me sajt koji treba da ima oko 100 stranica na kojoj je po jedan artikal to je znaci 100 stranica. Stranice ce se azurirati 1 godisnje ili ako dodje do greske u unostu podataka. Posto ja ne radim azuritanje, odradio sam cms koji fercera po planu.
MOje dileme su:
1) Da li uopste treba kesirati podatke (posto se radi o jednostavniim upitima select xxx from xxx where id=xxx)
2) Ako treba kako to odraditi.

Ovo pod dva bih mogao da granam do beskonacnosti, ali da se ne rasplinjavam, mislio sam da odradim preko cache lite, to mi deluje kao resenje problema samo imam problem sa vremenom brisanja pravljenja novog kesa. Mogu da namestim da se kes brise na svakih 10min ali ja bih zeleo da bude sveze. Da li je dobro resenje da kes odradim preko cache lite a da pri updateovanju podataka dodam i liniju koda koja bi osvezila kes?

Ako sam na pogresnom putu, ili znate neko optimalnije resenje molim vas da me uputite.

Hvala:)
 
Odgovor na temu

loonies
~

Član broj: 40927
Poruke: 248



+12 Profil

icon Re: Dileme oko kesiranja upita02.01.2013. u 23:42 - pre 136 meseci
Svaka normalana kes biblioteka ima "life time". Jednostavno podesis life time na zeljenu vrednost, a biblioteka se brine za sve ostalo.

Mozes da koristis npr takvu strategiju da podesis veliki life time, a da prilikom kreiranja/azuriranja sadrzaja brises kes.
And all you touch and all you see
Is all your life will ever be
---Δ==

Neugodna istina - reaguj! | Linux is not Windows
 
Odgovor na temu

hellofanta
Beograd

Član broj: 264949
Poruke: 35
212.200.231.*



Profil

icon Re: Dileme oko kesiranja upita04.01.2013. u 09:25 - pre 136 meseci
Hvala ti, to sam i mislio, da sam stavim brisanje kesa prilikom updateovanja baze.
Pozdrav :)
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-6.sezampro.rs.



+33 Profil

icon Re: Dileme oko kesiranja upita05.01.2013. u 16:41 - pre 136 meseci
Na osnovu toga što si opisao, tj. zahteva kojeg imaš, ja bih se tu pre odlučio za keširanje celih output-a tih stranica sajta, a ne samo rezultata upita zaduženih za dohvatanje podataka o nekom artiklu. Jer meni ta priča - 100 stranica na kojima se prikazuje po jedan artikal, plus činjenica da će se oni ažurirati najviše jednom godišnje, više vuče na neki statički sajt.

Tako da, tu je definitivno bolje i efikasnije ići sa keširanjem cele stranice, kako bi se izbegao overhead prolaska kroz PHP, ili kako bi taj prolazak trajao što kraće. Naravno, u obzir dolazi i varijanta sa keširanjem na dva nivoa, dakle keširanje rezultata SQL upita, plus keširanje cele stranice.

Što se implementacije tiče, to bi recimo išlo ovako nekako...

Cela stvar bi se u velikoj meri oslanjala na PHP-ovu Output Control funkcionalnost, tačnije na ob_start() funkciju. Ideja je da ta page keš implementacija bude negde "visoko" u tvom kôdu, kako bi učinak bio što bolji, u smislu da se keširani ispis što pre vrati korisniku. Sve to bi izgledao ovako nekako:

Code:

//Funkcije za dohvatanje/čuvanje keša

$cacheFolder = '/putanja/do/cache/foldera';
function loadPage($id) {
    $filePath = $cacheFolder . '/' . $id . '.html';
    if (is_file($filePath)) {
        return file_get_contents($filePath);
    }
    
    return false;
}
function savePage($id, $content) {
    $filePath = $cacheFolder . '/' . $id . '.html';
    file_put_contents($filePath, $content);
}


$id = $_SERVER['REQUEST_URI']; //URI trenutne stranice

if (($output = loadPage($id)) !== false) { //Stranica je keširana? Ispiši je...
    header('Content-type: text/html');
    echo $data;
    die();
}

//... u suprotnom, započni buffer-ovanje output-a
ob_start('_flush');
ob_implicit_flush(false);

//Callback nakon kompetiranja buffer-ovanja.
function _flush($output) {
    savePage($id, $output);
}


//... ovde bi išao tvoj kôd...

Čisto sumnjam da ovaj kôd radi, napisao sam ga na brzinu, iz glave, ali poenta je bila da ti dam ideju. Dakle imao bi neku logiku koja rešava pitanje keširanja - load/savePage() funkcije, i zatim taj deo sa "hvatanjem" output-a - ob_start(). I kao što vidiš, za taj neki id keš unosa bi se uzimao URI trenutne stranice.

Priča sad može i da se "zakomplikuje", tako što bi npr. još više mogao da ubrzaš stvar, na način da u .htaccess dodaš ovako nešto:
Code:
RewriteCond %{DOCUMENT_ROOT}/putanja/do/cache/foldera/index.html -f
RewriteRule ^/*$ putanja/do/cache/foldera/index.html [L]
RewriteCond %{DOCUMENT_ROOT}/putanja/do/cache/foldera/%{REQUEST_URI}.html -f
RewriteRule .* putanja/do/cache/foldera/%{REQUEST_URI}.html [L]

To u prevodu znači da bi se serviranje tih ukeširanih stranica radilo direktno, bez ulaska u PHP, što za rezultat ima ultra-performantno rešenje.

E sad, kao što sam već pomenuo, ovo moje rešenje ne bi trebao da shvataš toliko ozbiljno, u smislu da sad bukvalno kopiraš i pokušaš da iskoristiš taj snippet odozgo. To što sam ja napisao nije ništa novo, i već postoje gotova i mnogo kompletnija rešenja koja rade na tom principu, kao što je npr. Zend_Cache_Frontend_Page. Tako da, ja ti toplo preporučujem da integrišeš Zend_Cache na tvom sajtu.
 
Odgovor na temu

hellofanta
Beograd

Član broj: 264949
Poruke: 35
212.200.231.*



Profil

icon Re: Dileme oko kesiranja upita08.01.2013. u 09:01 - pre 136 meseci
NIkola, hvala ti na ovako iscrpnom odgovoru, izvini sto odgovaram sa zakasnjenjem, nisam bio pri kompu (to su onih 2 dana godisnje kad ne prilazim kompu).
Mislim da je tvoj odgovor odlican, to jest uputio si me u kom pravcu da razmisljam i realizujem sve. To mi je trebalo, savet iskusnog strucnjaka da ne lutam bezveze trazeci pravo resenje ( a da i ne znam koje je pravo-optimalno) resenje.
Hvala puno, cenim da cu na osnovu tvog koda i smernica, resiti ovo!
Pozdrav!
 
Odgovor na temu

plus_minus

Član broj: 289459
Poruke: 2242
*.dynamic.isp.telekom.rs.

Sajt: https://hardcoder.xyz


+2247 Profil

icon Re: Dileme oko kesiranja upita10.01.2013. u 21:40 - pre 136 meseci
Najbolja metoda za keširanje dinamičkih stranica jeste (po meni) php_apc (PECL) ili Php, Alternative PHP Cache.
Ukoliko tvoj hosting provajder dozvoljava korišćenje iste ekstenzije, slobodno možeš da probaš da se poigraš i sa tim.

php_apc

Kombinacija output buffera (ob_start(); ob_get_contents(); ob_end_flush();) sa apc_store, apc_get() _fetch() ... itd, itd,.. daje neverovatne rezultate po pitanju performansi.
Pored ove metode što ti pokaza Poša, ima još mali milion varijanti za korišćenje output buffera.

Što se tiče php_apc, taj mali framework omogućava da popakuješ (za razliku od sesija, npr.) čak i gotove spremne php funkcije u ram memoriju klijenta.

Fejsbuk npr. koristi i php_apc i memcache, zavisi za šta je pogodno jedno ili drugo.

Memcache je slična stvar, s' tim što radi na drugačijem principu gde je keširanje i te kako neophodno a u igri su ne jedan već farma servera.

php_apc je ono što tebi treba. A u kombinaciji sa buffering cakama - WinWin kombinacija.

Sve u svemu, proguglaj malo na tu temu, biće ti od koristi. :)
____
edit:

Evo i jednog finog tutorijala na tu temu.
Using APC with PHP

[Ovu poruku je menjao plus_minus dana 10.01.2013. u 23:05 GMT+1]
about:networking
 
Odgovor na temu

[es] :: PHP :: Dileme oko kesiranja upita

[ Pregleda: 1605 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.