Cache simplu bazat pe json

Post Title

Am scris o mica clasa de cache bazata pe json scris in fisier, cu ajutorul ei dupa ce preluati date din baza de date, daca acestea nu sunt schimbate le serviti din aceste fisiere, de exemplu aveti nevoie de date de la un query imens ce dureaza 2-3 secunde, dupa ce va fi scris in fisier in loc de request de 2-3 secunde datele vor fi servite in cateva milisecunde. Mai jos va voi lasa codul php 

  1.  
  2. <?php
  3.  
  4. /**
  5.  * @Package: Micul-Programator.ro simple cache
  6.  * @Author: Marian
  7.  * @$Date: 06/14/2014
  8.  * @Contact: [email protected]
  9.  * @$Rev: 1
  10.  */
  11. class mpCache {
  12.  
  13. /**
  14.   * Directorul unde vor fi stocate fisierele de cache
  15.   */
  16. private static $_dir = "cacheFiles/";
  17.  
  18. /**
  19.   * Scrie un fisier .json in care vor fi stocate datele
  20.   * @param string $identificator -> identifica in mod unic un fisier de cache
  21.   * @param array $data -> array-ul cu datele primite de la baza de date
  22.   * @return void
  23.   */
  24. public static function writeCache($identificator = null , $data = array()) {
  25.  
  26. if ( !$identificator || !count($data) ) { return false; }
  27.  
  28. file_put_contents(trim(mpCache::$_dir.$identificator).".json",json_encode($data));
  29.  
  30. }
  31.  
  32. /**
  33. * Citeste un fisier .json si returneaza continutul acestuia
  34. * @param string $identificator -> identifica in mod unic un fisier de cache
  35. * @return array $data -> continutul fisierului de cache este returnat ca array
  36. */
  37. public static function readCache($identificator = null) {
  38.  
  39. if ( $identificator == null ) { return array(); }
  40. $file = trim(mpCache::$_dir.$identificator).".json";
  41.  
  42. if (!file_exists($file)) {
  43. return array();
  44. }
  45.  
  46. $data = file_get_contents(trim(mpCache::$_dir.$identificator).".json");
  47. return json_decode($data,true);
  48.  
  49. }
  50.  
  51. /**
  52. * Sterge un fisier cache
  53. * @param string $identificator -> identifica in mod unic un fisier de cache
  54. * @return boolean
  55. */
  56. public static function deleteCache($identificator = null) {
  57.  
  58. $file = trim(mpCache::$_dir.$identificator).".json";
  59.  
  60. if (!file_exists($file)) {
  61. return true;
  62. }
  63.  
  64. if (unlink($file)) {
  65. return true;
  66. }
  67.  
  68. return false;
  69.  
  70. }
  71. }
  72.  
  73. ?>

Si un mic exemplu

  1.  
  2. <?php
  3.  
  4. include_once('cache.php');
  5.  
  6. $dbData = array(
  7. 'id' => 1234,
  8. 'name' => 'Categorie pentru incepatori',
  9. 'description' => 'Aceasta este o categorie pentru incepatori, dar poate participa oricine',
  10. 'status' => 1,
  11. );
  12.  
  13. //Citeste un fisier cache
  14. $data = mpCache::readCache('cacheFile-'.$dbData['id']);
  15.  
  16. if (!count($data)) {
  17.  
  18. print 'Se scrie in cache';
  19. //Scrie un fisier cache
  20. mpCache::writeCache('cacheFile-'.$dbData['id'],$dbData);
  21.  
  22. } else {
  23.  
  24. print "Se citeste din cache <br />";
  25. print_r($data);
  26. }
  27.  
  28. //sterge un fisier cache
  29. //mpCache::deleteCache('cacheFile-'.$dbData['id']);
  30.  
  31. ?>

Codul este si pe github in caz ca doriti sa ajutati cu dezvoltarea.

 

Autor articol

Ştiinţa fără religie este şchioapă, religia fără ştiinţă este oarbă (Albert Einstein)

Articolul anterior


Comentarii

Comentariu adaugat de marian
Iti inteleg punctul de vedere, eu nu am incercat decat sa simplific cat mai mult, poate ai dreptate si nu e ok pentru un incepator , o sa fac improve la cod in cel mai scurt timp poate va ajuta mai mult incepatorii, ms de feedback
go to page top marian | 2014-07-02
Comentariu adaugat de vlad.balmos
Eu am intalnit programatori care s-au lovit de race conditions, tocmai pentru ca nu faceau file lock cand scriau continut in fisiere, si in loc ca liniile de text/continutul sa le apara in ordine cronologica, apareau all over the place. Mai ales in PHP, un limbaj de programare destinat web-ului unde un site are de regula mai mult de un utilizator care acceseaza aceeasi pagina/modul/etc.

Referitor la partea cu "static". Sunt de acord cu tine cand vine vorba ca trebuie sa folosesc clasa oriunde in cod, dar ce fac cand vreau sa fac un unit test pe o clasa care foloseste cache? Cum dezactivez cache-ul ca sa nu depinde de file system in momentul cand rulez testul. As vrea sa pot inlocui obiectul de cache cu un stub care sa-mi prezinte aceeasi interfata, dar sa nu faca absolut nimic pe durata executiei testului. Aici apar problemele cu clasele statice. Am folosit Laravel, dar daca te-ai uita atent in core, ai vedea ca mai toate componentele nu sunt statice, ci sunt instantiate iar un obiect de tip fatada prezinta aceeasi interfata statica ca obiectul instantiat iar in spate se apeleaza metodele pe instanta. Practic apelurile statice din Laravel actioneaza ca un proxy intre tine si instanta clasei respective. Tocmai pentru a facilita ce am zis mai sus, si anume partea de testare. 
Fatadele in Laravel se folosesc impreuna cu un dependency injection container.

Daca ai deschide fisierul laravel/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php 
vei vedea la sfarsitul clasei metoda __callStatic, care actioneaza ca un proxy intre client (cel care face apelul) si instanta.

Exemplu:

$result = Cache::store('shit') 
apelul de mai sus are ca efect:
1. se apeleaza Cache::__callStatic('store', array('shit'))
2. se cauta instanta clasei Cache in dependency injection container, sau se creeaza daca e primul apel
3. se apeleleaza $cache->store('shit')

Eu apreciez efortul tau cu tutorialele, dar am vrut sa pun problemele astea tocmai ca un beginner sa fie pus pe ganduri in momentul cand se uita la cod si sa-si dea seama
ca lucrurile nu sunt chiar atat de simple.
go to page top vlad.balmos | 2014-07-02
Comentariu adaugat de marian
Eu zic ca are, defapt chiar are, daca nu e absoluta nevoie de un obiect atunci nu are rost sa il tii in memorie, mai ales ca nu e nici un patern mai sus, mai ales ca eu trebuie sa pot folosi clasa oriunde in cod si metodele trebuie sa fie dependente de obiect, daca te documentezi un pic despre asta o sa vezi ca are sens, mai ales daca o sa studiezi cake sau laravel. 

Nu e greu sa fac asta cum nu este nici pentru tine greu sa faci un git clone si sa faci o modificare apoi sa faci un commit si astfel sa corectezi codul care crezi tu ca nu e ok.

Cat despre un incepator daca nu se documenteaza nu vad sensul in a mai fi programator, ba chiar mai mult sa nu imi zici ca un programator incepator php se va intalni cu racecondition, ca nu se va intalni, mai ales in php.

Cu cat o sa fie mai stufos codul meu cu atat doar va fi folosit nu si inteles

Dar ca sa iti fac pe plac o sa updatez codul din clasa.
go to page top marian | 2014-07-02
Comentariu adaugat de vlad.balmos
In primul rand nu ti-am contestat competentele tale de programator. Eu am vorbit strict de codul din articol. Apoi - explica-mi si mie de unde sa inteleaga un programator incepator (caruia i-a zis careva "bah! vezi ca ai nevoie de caching") faptul ca bucata aia de cod e demo si nu trebuie folosita, cand tu scrii in descriere:

"Am scris o mica clasa de cache bazata pe json scris in fisier, cu ajutorul ei dupa ce preluati date din baza de date, daca acestea nu sunt schimbate le serviti din aceste fisiere, de exemplu aveti nevoie de date de la un query imens ce dureaza 2-3 secunde, dupa ce va fi scris in fisier in loc de request de 2-3 secunde datele vor fi servite in cateva milisecunde. Mai jos va voi lasa codul php "

Apoi o alta chestie. De unde sa stie un incepator cu 6 luni - 1 an experienta de file locking si race conditions? Ce era asa greu sa faci:

file_put_contents('cache.file', $content, LOCK_EX)

?

Exemplu prost faptul ca ai facut metodele statice. Un beginner o sa faca si el la fel totul static, pentru ca asa a vazut pe net. Explicatia ta nu are niciun sens. Cum as putea sa pasez funtionalitatea de caching la o alta componenta fara sa hardcodez dependinta (dependecy injection)? Daca tot facem tutorial, hai sa le facem cum trebuie, nu?

 
go to page top vlad.balmos | 2014-07-02
Comentariu adaugat de marian
Gresit nu inveti prost din cauza acestui tutorial ci din cauza faptului ca nu te documentezi cum trebuie si dai vina in stanga si in dreapta, te inseli amarnic daca crezi ca fac programare de cateva luni sau daca nu am avut incepatori pe mana in cadrul firmei unde lucrez, clasa e scrisa exact pentru cei incepatori sa poate intelege si ei la randul lor sa o poata dezvolta. 

Asa dupa parerea ta cand scriu ca e in dezvoltare clasa si ca e un simplu cache nu se intelege clar ca nu se foloseste in productie? ci doar pentru teste si vezi conceptul de programare?

Cat despre metodele statice : pentru clasa de mai sus nu e necesar sa fie un obiect tinut in memorie mai ales ca metodele trebuie sa fie indepente dar trebuie sa fie incapsulate
go to page top marian | 2014-07-02

Exista 8 comentarii   

Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare Logare cu Facebook
top