Užklausos į duomenų bazę cache’avimas

Lygiai su tokia problema ir man teko susidurti, kaip šio rašinio autoriui. Kada užkešuoti kontrolerio funkciją neužtenka, nes ji gražina du ar daugiau skirtingus duomenų kiekius. Šis sprendimas leidžia kešuoti kiekvieną užklausimą į duomenų bazę atskirai:

  1. // Cache query to /tmp/cache/sql/model-test_sql_query
  2. $results = $this->Model->find('all', array(
  3.  'cache' => 'test_sql_query'
  4. ));
  5.  
  6. // Cache query to /tmp/cache/sql/model-another_query that expires in 24 hours
  7. $results = $this->Model->find('all', array(
  8.  'cache' => array('another_query', '+24 hours')
  9. ));

Visa dokumentacija bei kodas – milesj.me

Data 2009.04.17 Komentarai 2 Kategorija CakePHP Žymės ,

Wordpress ir CakePHP draugija

Jeigu esate sukūrę aplikaciją CakePHP karkasų, tačiau reikia įdiegti ir Wordpress blogą kaip pvz www.example.com/blog/ adresu, šis sprendimas .htaccess pagalba jums padės:

  1. RewriteEngine on
  2. RedirectMatch temp ^/blog/wp-admin$ http://www.example.com/blog/wp-admin/
  3. RewriteRule blog$ /blog/ [L]
  4. RewriteRule blog/wp-admin$ /blog/wp-admin/ [L]
  5. RewriteRule ^$ app/webroot/ [L]
  6. RewriteRule (.*) app/webroot/$1 [L]

Šaltinis: sebgalarneau.com

Data 2009.04.15 Komentarai 0 Kategorija CakePHP Žymės ,

BaseApp ypatingai lengvas (iki 50Kb) PHP5 karkasas, įkveptas CakePHP API

Nors BaseApp dar nėra jokios dokumentacijos, bet tas lengvumas patraukė dėmesį. Trumpai aprašomas:

  • Ypatingai mažas (iki 50Kb archyvuotas)
  • Labai greitas
  • Beveik jokios konfigūracijos
  • Greit išmokstamas
  • Lengvai išplečiamas
  • Licenzija be apribojimų

Techninės detalės:

  • PHP5
  • Pilnai MVC
  • CakePHP API bei šablonai
  • Active Records bei ORM
  • Reikšmių validacija bei helper’iai
  • Beveik visos palaikomos duomenų bazės
  • FireBug palaikymas
  • “Sausainių” (Cookie) bei sesijų valdymas

Kas dirbęs su CakePHP, manau nesunkiai sugebėtų šiek tiek pažaist su šiuo karkasu ir be dokumentacijos.

counterCache įrašų skaičiui saugoti

Imkime kaip pavyzdį užduočių valdymo (ToDo) aplikaciją ir norime sužinoti kiek kiekvienoje kategorijoje yra nebaigtų darbų.

  1. CREATE TABLE IF NOT EXISTS `task_categories` (
  2.   `id` int(10) unsigned NOT NULL auto_increment,
  3.   `item_count` int(10) unsigned NOT NULL,
  4.   `name` varchar(32) NOT NULL,
  5.   `created` datetime NOT NULL,
  6.   PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  8.  
  9. CREATE TABLE IF NOT EXISTS `task_items` (
  10.   `id` int(10) unsigned NOT NULL auto_increment,
  11.   `task_category_id` int(10) unsigned NOT NULL,
  12.   `user_id` int(10) unsigned default NULL,
  13.   `name` varchar(128) NOT NULL,
  14.   `description` text NOT NULL,
  15.   `status` tinyint(3) unsigned NOT NULL,
  16.   `created` datetime NOT NULL,
  17.   PRIMARY KEY  (`id`),
  18.   KEY `task_category_id` (`task_category_id`,`user_id`)
  19. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Taigi, turime du modelius – TaskCategory ir TaskItem.:

  1. class TaskItem extends AppModel {
  2.  var $name = 'TaskItem';
  3.  
  4.  var $belongsTo = array(
  5.   'TaskCategory' => array(
  6.    'className' => 'TaskCategory',
  7.    'foreignKey' => 'task_category_id',
  8.                         'counterCache' => 'items_count',
  9.                         'counterScope' => 'status = 0'
  10.   )
  11.  );
  12. }
  1. class TaskCategory extends AppModel {
  2.  var $name = 'TaskCategory';
  3.  
  4.  var $hasMany = array(
  5.   'TaskItem' => array(
  6.    'className' => 'TaskItem',
  7.    'foreignKey' => 'task_category_id',
  8.    'dependent' => true,
  9.   )
  10.  );
  11. }

Šiuo atveju žiūrim į TaskItem modelyje ‘counterCache’ => ‘items_count’ ir ‘counterScope’ => ’status = 0′ nustatymus. Pirmasis nurodo lentelės lauką kur bus saugojamas įrašų kiekis, antrasis nurodo, jog skaičiuoti tik tuos, kada TaskItem.active lygus 0 (darbas neatliktas).
Viskas, nuo šiol nereiks atskirai skaičiuoti kiekvienos kategorijos neatliktų darbų kiekio papildomomis užklausomis bei funkcijomis. Tuo pačiu gauname optimizuotą sistemą.
ToDo kategorijos

MySQL procedūrų naudojimas CakePHP

Pačiam dar neteko naudoti, bet pastebėjau gerą įrašą ta tema. Pirmiausia duomenų bazės nustatymuose (config/database.php) nustatom tvarkyklę:

  1. 'driver' => 'mysqli'

Procedūra iškviečiama $this->query() pagalba:

  1. function findAd($site) {
  2.  $advert = $this->query('CALL display_ad("'.$site.'");');
  3.  return $advert;
  4. }

Toliau šią funkciją panaudojam kontroleryje:

  1. function show($site = null){
  2.  $advert = $this->Advert->findAd($site);
  3.  $this->set('advert', $advert[0]);
  4. }
Data 2009.04.03 Komentarai 0 Kategorija CakePHP Žymės ,