Optimizare SELECT cu Cache

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
andras
Mesaje:430

Optimizare SELECT cu Cache

Salut,
Am un buton care face SELECT pe o tabela cu 38 cimpuri si 1600 inregistrari. Cum se poate optimiza, adica doar prima data sa faca SELECT si urmatoarele apelari sa le ia din memorie ? Asta e valabil si pentru alte tabele cu volume mai mari de date. Multumesc.

MarPlo Mesaje:4343
Salut
Eu folosesc un fisier cache salvat pe server, care contine datele prelucrate din select.
Cam asa:

Cod: Selectaţi tot

$file_cache ='cache/nume_select.htm';  //path and name of file with cached data

//if $file_cache not exists, or it is older than 1 hour, gets data from mysql
//else, from cache
if(!file_exists($file_cache) || (time() - filemtime($file_cache)) >3600){
  $re_data ='contains final data from mysql';
  file_put_contents($file_cache, $re_data);  //store final data in $file_cache for next requests
}
else $re_data = file_get_contents($file_cache);

//the rest of code that uses data from $re_data 
- Numele fisierului "nume_select.htm" depinde de Select-ul care se face; cate un fisier cache pentru fiecare Select diferit.
Acel fisier cache e sters (cu unlink() ) cand se modifica datele in mysql (la insert /update /delete).

andras Mesaje:430
Apare roare de conversie array - string

Cod: Selectaţi tot

Notice: Array to string conversion in C:\xampp\htdocs\cms\include\modelselect.php on line 18
Am facut asa:

Cod: Selectaţi tot

<?php
$file_cache ='../cache/select'.$clasa.'.htm';  
if(!file_exists($file_cache) || (time() - filemtime($file_cache)) >3600){
  $rows =  $conn->sqlExec($re);   //  face SELECT-ul din tabela
  file_put_contents($file_cache, $rows); 
}
else $rows = file_get_contents($file_cache);
?>
Am gresit undeva?

MarPlo Mesaje:4343
Pai nu poti sa salvezi un array asa cum e intr-un fisier, se converteste in tip sir (string), indicat in format json, apoi se salveaza ca sir pe server.

Sistemul de retinere date in fisiere cache e util cand reduci numarul de apelari si executii de functii pe server. Ce rost are sa salvezi tot rezultatul dintr-un Select in fisier text si apoi sa-l iei de acolo si sa-l transformi iar in array, cand poti mai simplu sa apelezi o functie care face iar acel Select.
Pe acest site folosesc sistem de cache la pagini (cu date in format json) nu pentru a salva un intreg Select si atat; ci in acel cache salvez datele paginii rezultate din mai multe Select-uri si prelucrari ale datelor returnate, ca sa nu se mai faca acele Multe operatiuni la fiecare accesare a paginii.
De exemplu, fisierul cache pt. o pagina de site ('nume_pagina.json") arata asa:

Cod: Selectaţi tot

{
  "title": "Titlu pagina...",
  "desc": "Descrier pagina ...",
  "menu_top": "Cod html Meniu in header",
  "menu_side": "Cod html Meniu lateral",
  "cnt": "Cod html cu continutul din Body",
  "footer": "Cod html cu meniu si alte date fixe din Footer"
}
Se reduc astfel o multime de operatiuni la accesarea paginii lund datele din cache deja definite pt. pagina. Daca ar fi vorba de unul sau doua Select-uri fara alte prelucrari, asi lasa asa, fara sa complic codul.

- Revenind la eroarea "Array to string conversion", dupa ce datele Selectate sunt prelucrate si definite intr-un array, acel array il salvez ca sir json in cache, iar la citire il transform si folosesc iar ca array. Cam asa:

Cod: Selectaţi tot

$file_cache ='cache/page_name.json';  //path and name of file with cached data

//if $file_cache not exists, or it is older than 1 hour, gets data from mysql
//else, from cache
if(!file_exists($file_cache) || (time() - filemtime($file_cache)) >3600){
  // Selects and other Data processing..

  $re_data =['title'=>'Titlu..', 'desc'=>'Descriere..', 'etc'=>'etc..'];  //array with page data
  file_put_contents($file_cache, json_encode($re_data));  //store page data in $file_cache in json format
}
else $re_data = json_decode(file_get_contents($file_cache), true);  //gets array with page data from cache

//the rest of code that adds data from $re_data in Template and builds the page 
- Sistemul de cache e o idee buna de aplicat cand se simplifica mai multe operatiuni la accesari repetate, nu cand Doar complica codul.

Subiecte similare