10 Tips om de CakePHP Performance te verbeteren

Na enkele artikelen over Linux te hebben geschreven is het nu weer tijd om te schrijven over Webdevelopment.

Veel webdevelopers vinden CakePHP een traag framework. Daar zit een kern van waarheid in, maar echter zijn er veel mogelijkheden om de Cakephp performance te verbeteren. Uiteindelijk heeft de snelheid van het framework na optimalisaties veel minder invloed op de performance van een website als gedacht wordt. Laten we beginnen met het optimaliseren!

Opcode caching (APC)

Indien je nog geen gebruik maakt van opcode cache, doe dat dan nu! Het zorgt ervoor dat de PHP-code geoptimaliseerd wordt en de gecompileerde bytecode in het geheugen wordt opgeslagen. Het zorgt tevens voor een lager geheugengebruik over de algehele Cakephp applicatie. De installatie van APC is zo enorm makkelijk en kost slechts 3 minuten, maar het snelheidsverschil is enorm!

Cakephp maakt standaard automatisch gebruik van APC, indien het beschikbaar is met de volgende code in je core.php-bestand. Vergeet niet daaronder een unieke $prefix in te stellen om conflicten met andere sites te voorkomen.

<?php
$engine = 'File';
if (extension_loaded('apc') && function_exists('apc_dec') && (php_sapi_name() !== 'cli' || ini_get('apc.enable_cli'))) {
$engine = 'Apc';
}

$prefix = 'sitenaam_';
?>

Je ziet hieronder heel mooi in de afbeelding van het Yii framework, hoeveel invloed APC maar liefst heeft op de performance van websites.

Cakephp Performance met en zonder APC

Er worden prestatie-verbeteringen van 700% gemeten slechts door het gebruik van APC.

Neem de performance-vergelijking tussen CakePHP en Yii overigens niet te serieus verder, ik wilde voornamelijk het performance-verschil tussen wel of geen APC gebruiken laten zien. Het is slechts een advertentie-afbeelding voor het gebruik van het Yii framework. Yii is weliswaar een sneller framework dan CakePHP, maar CakePHP 2.3 stable is inmiddels uit en deze is aanzienlijk sneller dan de geteste CakePHP 1.2.1 (4 jaar oud, uit Q1 2009).

Performancewinst: 50-300%

CSS/JavaScript Combineren/Minify

Er zijn enkele goede plug-ins voor het combineren van minificeren van CSS en Javascript bestanden.

Dit zorgt ervoor dat bezoekers nog maar 1 JavaScript/CSS bestand te hoeven downloaden in plaats van tientallen. Het combineren en minificeren van CSS/Js is belangrijk voor alle grote sites en staat ook in de tips van Google en Yahoo om je website performance te verbeteren.

Performancewinst: 20%

Caching (Varnish, Client-side)

Indien je de website achter Varnish zet, dan worden de afbeeldingen, css-bestanden en statische pagina’s (zonder sessions) direct gestuurd vanaf de cache server. Je kunt je site achter Varnish zetten of in CakePHP een plug-in schrijven waarbij requests niet terecht komen bij de applicatie, maar rechtstreeks de HTML toesturen.

Je kunt maar tot een bepaalde niveau je applicatie optimaliseren. Er is een moment dat je massaal van caching gebruik moet gaan maken om de load op de back-ends laag te houden.

Performancewinst: 300-1000% (op pagina’s die vanuit de cache geladen worden)

Caching (CakePHP)

Indien je steeds dezelfde data opvraagt vanuit MySQL om bijvoorbeeld een menu te generen of een lijst van links die je op elke pagina print, dan is het verstandiger om de data op te slaan in de cache.

Indien je op elke pagina de links opvraagt, die het dan bijvoorbeeld op deze manier. Dan wordt er niet elke keer opnieuw precies dezelfde MySQL query uitgevoerd.

<?php
if (($links = Cache::read('links')) === false) {
$links = $this->Link->find('all', array('recursive'=>-1, 'links' => array('name', 'url'), 'order' => 'Link.id DESC', 'limit'=>6));
Cache::write('links', $links);
}
$this->set('links', $links);
?>

Het loont ook om de views en elementen op je pagina te cachen.

<?php echo $this->element('analytics', array('cache'=>'+1 hour')); ?>

Performancewinst: 10-50% (afhankelijk van aantal queries, querytijd)

MySQL Query Caching

Je kunt veel snelheidswinst behalen met MySQL query caching, dat is erg eenvoudig in te stellen.

Het is in bepaalde applicaties mogelijk dat de SQL queries gezamenlijk wel 300-350ms duren, via MySQL query caching kunnen de resultaten soms direct vanuit het geheugen geladen worden.

Performancewinst: 25%

MySQL Queries herschrijven en Indexen aanmaken

Het is erg belangrijk om je database te optimaliseren, heb je de correcte indices ingesteld? Het is tevens belangrijk om de goede queries te schrijven.

Voor de meeste applicaties is het werken met $this->Model->find(‘all’) erg makkelijk, het debuggen wordt ook makkelijk. De performance verslechtert echter indien je de gegevens van een gehele tabel opvraagt.

Het gebruiken van $this->Model->find(‘all’) is veel te makkelijk en het loont de moeite om de queries heel specifiek te schrijven en slechts specifieke velden op te vragen en daarop indexen aan te brengen in de MySQL database.

Performancewinst: 25%

Geen gebruik maken van var/public $uses.

Update (16-04-2013) – Dit is niet meer van toepassing sinds Cakephp 2.x. In CakePHP 2.x is het gebruik van $uses niet meer van invloed op de performance. Models zijn lazy loaded. Dank aan commentaar van Ceeram.

Het stoppen van het gebruiken van $uses helpt een beetje. De toegang naar andere modellen via associaties is sneller. Je kunt bijvoorbeeld een ander model benaderen via $this->Model1->Model2 in plaats van het gebruiken van public $uses => array(“Model1”, “Model2”).

Performancewinst: 10%

Debugging uitzetten

Deze is eigenlijk erg logisch. Het is cruciaal dat debugging op 0 staat op productie-servers, want foutmeldingen gaan de eindgebruiker niets aan. Maar ook al print je geen foutmeldingen in debug-mode, het verschil is performance is enorm. In debug-mode wordt geen gebruik gemaakt van model/view-caching e.d. en de performance is aanzienlijk minder. Het kan zijn dat je vergeten bent debug-mode uit te zetten, dus ik heb deze alsnog geplaatst.

Performancewinst: 50%

Externe Tools

Er zijn nog enkele tools die helpen met het verbeteren en analyseren van de performance.

  • Google Pagespeed – Je kunt via Google je site laten testen.
  • GTMetrix – Ook erg goede website om je site te laten analyzeren
  • Is Varnish working? – Indien je Varnish gebruikt, kun je op deze pagina testen of alles ook door Varnish verwerkt wordt, of uiteindelijk op de back-end terecht komt.

Conclusie en laatste tips

Installeer de CakePHP DebugKit en ga op zoek naar knelpunten. Hoeveel geheugen wordt er gebruikt? Zijn er langzame queries? Indien er veel langzame queries zijn, dan kun je kijken naar de eerder genoemde Caching (SQL) en MySQL optimalisaties.

In mijn ogen is het cruciaal om hiervan gebruik te maken:

  • APC – Op-based caching – 3 minuten om te installeren
  • MySQL query caching – 1 minuut om te configureren
  • Javascript/CSS/HTML minificatie – 10 minuten on te configureren, niet alles hoeft in 1 .js, 1.css bestand te eindigen. Indien je van 12 .css bestanden naar 2 komt, scheelt dat al 10 requests die bij elke pageview binnenkomen op de server.

Het is te eenvoudig om dat niet te doen en de performance-winst is enorm. Daarbij zijn er nog veel manieren die minder met CakePHP optimalisaties te maken hebben, om de performance te verbeteren.

  • Gebruik maken van een CDN
  • De load van de servers verlagen
  • CSS/Javascript/PHP-code verbeteren
  • Extra hardware plaatsen

Stuur ook vooral je eigen tips in!

Comments

  1. WillemSiebe says:

    Nog een blog om te volgen ;-). APC heb ik ge├»nstalleerd, ben kortgeleden het avontuur aangegaan met een eigen server bij VPS.net. Deze heb ik geoptimaliseerd voor WordPress, maar het is voor mij nog veel kunst en vliegwerk ;-). Zodra ik alles stabiel heb, ga ik mijn websites op shared hosting mooi naar mijn eigen server verhuizen. Hoop dat het goed met je gaat! Onder de indruk van je taalvideo’s, leuk initiatief.

    Groet Willem-Siebe

    • Hey Willem-Siebe, leuk wat van je te horen! Sorry voor de late reactie, ik had je bericht niet gezien. APC heeft inderdaad een flinke impact op de performance van PHP scripts. Op WordPress is het ook echt de moeite waard om een caching plug-in te gebruiken, WP Super Cache (http://wordpress.org/extend/plugins/wp-super-cache/) bijvoorbeeld is erg goed, W3 Total Cache is ook goed, maar onnodig complex voor de meeste websites. Ik zal binnenkort eens lijst maken hier van mijn favoriete WordPress-plugins. Succes nog met je websites!

      • WillemSiebe says:

        Hey Dennis, geen probleem. Ben benieuwd naar jouw lijst, maar ik denk dat er voor mij geen verassingen tussen zullen staan ;-). Ik weeg altijd alles tegen elkaar af, zo ook WP Super Cache of W3 Total Cache. Hoe dan ook, ik ga stoppen met mijn eigen server. Ik heb daar simpelweg niet de kennis voor en wil mij dit ook niet eigen gaan maken. Elke minuut dat ik bezig ben met mijn eigen server kan ik ook steken in het bouwen van website, focus dus ;-). Ik ben nu overgestapt (nog aan het overstappen) naar WP Engine. De resultaten zijn goed, zodra mijn blog online is zal ik de resultaten delen, mocht je dat leuk vinden om te lezen. Groet Willem

  2. in CakePHP 2.x is het gebruik van $uses niet meer van invloed op de performance. Models zijn lazy loaded

Geef een reactie