Skip to main content

Performance Tuning MySQL PHP Joomla

Houd er rekening mee dat de doorsnee shared-host niet is ingericht op databases die groter zijn dan enkele (tientallen) Megabytes. datafeeds verbruiken circa 1 Mbyte per 1000 items. Als de tabel met items te groot wordt ga je dat in de performance merken, http requests duren langer,  de server krijgt ze niet weggewerkt en de http-processen stappelen zich op. Met name mod_datamenu's (de menu's/zoek versies) kunnen vrij zware query's opleveren. In het minst ergste geval schopt je hoster je de deur uit, erger is dat je bezoekers afhaken.

Op een goede shared host moet het geen probleem zijn websites met 20-40 duizen items te hebben.

Hieronder een rijtje met tips. Met (shared) is aangegeven of deze aktie op een shared host mogelijk is. De meeste tips zijn niet joomla-datafeeds specifiek maar algemeen te gebruiken.

In onderstaande wordt uitgegaan van de standaard configuratie van joomla met de prefix jos_, pas dit eventueel aan.

Website splitsen (shared)

Het splitsen van de website in meerdere is een oplossing om de database klein te houden, helaas ondersteund joomla multi-site niet lekker ( er zijn componenten voor te koop ) dus heb je hier meerdere keren onderhoud.

Joomla cache (shared)

Wat goed helpt is het inschakelen van de cache van joomla. Meestal is het inschakelen van cache voor modules geen goed plan omdat joomla dit wat knullig cached ( niet pagina afhankelijk ). De caching van mod_datamenu houdt er rekening mee dat elke pagina een andere (en zelfs meerdere) module-inhoud toont. Echter omdat de feeds uit heel veel items bestaan met heel veel menu's en submenu's komen er ook heel veel bestanden in de cache te staan. Hier heb je dus weer flink ruimte nodig op schijf. En er zijn ervaringen dat de file cache weer langzaam wordt als er veel bestanden instaan.

 

waarschuwing : Op een omvangrijke site (veel menu's) kan de cache heel groot worden ( Gig's) er is dan kans dat je in de problemen komt om de cachee weer te wissen !!!

sessions op none (shared)

In de standaard installatie slaat joomla de sessions op in de database. Dat zijn een aardige hoeveelheid lees en schrijf akties. Je kunt de session ook file based maken door de setting op 'none' te zetten. Dan slaat php de sessies op de disk op. Dat kan per saldo voordeliger zijn.

Nog mooier zou zijn de sessies voor de frontend uit te schakelen, of en hoe dit kan moet nog uitgezocht worden. In feite is heel het sessie verhaal onzinnig zolang men niet inlogt ( ok, ok er zijn modules en plugins die het wel nodig hebben....)

php zlib compressie (shared)

php heeft de mogelijkheid om de content (de genereerde html) te bufferen en voor versturen te comprimeren. Dit heeft het voordeel dat er minder bandbreedte nodig is. Dat is ( was met huidig breedband ? ). Als je bij je host op een budget zit met betrekking tot bandbreedte kan het een optie zijn zlib aan te zetten om te sparen.

Keerzijde is dat bij output buffering die hele content op de server blijft totdat alles gereed is, bij ongebufferde output gaat de zaak meteen de deut uit, er is dus minder geheugen nodig. Daarnaast is er voor het comprimeren op het einde extra performance van de server nodig.  Het kan dus helpen zlib compressie uit te zetten.

Bij websites als deze bestaat bovendien een groot deel van de data uit niet php output ( javascript, afbeeldingen, stylesheets) en het is maar de vraag of je met zlib compressie veel bespaart.

  • in php.ini zlib.output_compression = On/Off
  • in .htaccess php_flag zlib.output_compression on/off

Een alternatieve manier om compressie toe te passen is via de apache server zelf. Terwijl er zelf ervaring zijn met een negatieve invloed op de performance bij php-zlib compressie, zijn er op dezelfde server positieve ervaringen met AddOutputFilterByType DEFLATE

MySQL Indexen optimaliseren (shared)

Als mod_datamenu gebruikt wordt om content aan het dataitems menu te koppelen (artikel variant) dan voert de module een zoekaktie uit op de alias in jos_content hier is geen index op:

ALTER TABLE `jos_content` ADD INDEX ( `alias` ) ;

 

mysql

 

De belangrijkste parameter om de performance van mysql te beinvloeden is geheugen. Hoe meer geheugen hoe meer mysql in geheugen kan cachen en hoe beter de performance wordt. Aangezien geheugen akties nog steeds een factor sneller zijn dan lezen en schrijven van de harddisk. Daarnaast is het zaak het geheugen binnen joomla goed toe te wijzen belangrijke parameters:

  • mysql key_buffer

  • mysql query_buffer

  • mysql table_cache

  • delay_key_write

mysql verdere tips

Nog een paar opties die je kunt overwegen om met name ruimte te besparen:

  • skip-networking
  • skip-bdb
  • skip-innodb

Waarschijnlijk zijn er bij de installatie van MySQL een aantal voorbeeld configuraties meegeinstalleerd. zoek op de hardeschijf of google op my-huge.cnf my-large.cnf. Prima inzicht in de mogelijkheden, met aardig wat uitleg

mysql slow queries

Interresant is het om te weten waar het misgaat. MySQL heeft de mogelijkheid queries die erg lang nodig hebben te loggen met behulp van de volgende opties. In de server status via phpmyadmin kun je trouwens zien hoeveel slow queries er zijn.

  • log_slow_queries
  • log_long_format

En om te kijken welke queries geen index gebruiken en dus potentieel traag zijn:

  • log-queries-not-using-indexes (mysql > 4.1)

Met laatste parameter kan er een flinke hoeveelheid langskomen, wellicht geen goed idee deze logging altijd aan te hebben

Waar de log-file dan staat is afhankelijk van je omgeving

 

my.cfg voorbeeld

 

Onderstaande configuratie voor mysql houd databases met bijna 200.000 items draaiende op een VPS met 786MBytes geheugen. Af en toe is het wat krap.

 

{include_code_listing /var/www/www.affiliatefeeds.nl/images/code/my-cfg-89.txt}

 

accelerators (shared ? )

Er zijn verschillende php accelerators, Zend, fastcgi en meer. Dit zou allemaal prima smaen moeten werken met joomla+datafeeds maar er is nog geen ervaring mee.

Eigen Hosting

Aan de mysql parameters sleutelen mag op een shared host meestal niet. De oplossing is dan een VPS of Dedicated Server.

Een eigen server is ook de oplossing als je joomla cache erg veel ruimte in beslag neemt.

 

En verder

als het nog wilder wordt ga dan denken aan meerdere servers. Aparte server voor mysql, mysql database splitsen over meerdere schijven, andere database engine (InnoDB), meerdere apacher servers, squid als proxy/load balancer. Maar bovenal meer geheugen..

Heb je tips, kommentaar of aanvullingen? Graag !

 


Waar zijn de karakters/leestekens heen?

Sommige elementen in feeds bevatten leestekens, sommige van de leestekens kunnen ergens in de keten van MySQL/php/joomla/html problemen veroorzaken.

Het gaat om : '/-:&"?_+

De ' en " zijn lastig met MySQL, de /,?,+ en & kunnen problemen veroorzaken in de URL. De - en : worden door joomla op een bijzondere manier behandelt in verband met het SEF systeem.

Daarom worden deze tekens vervangen door een spatie ( ` in geval van ') voordat elementen ( selecties/menu items) aan de MySQL database worden  toegevoegd.

In de callback functie zijn de leestekens nog niet aangepast. Als je op de site bijvoorbeeld 'Nieuw Zeeland' hebt staan kan dat zijn oorsprong hebben in 'Nieuw-Zeeland' of 'Nieuw Zeeland'.

En umlauten en karakteres met trema's en zo?

Het is toegestaan umlauten en soortgelijke karakters in de URI op te nemen, soms wordt de URI dan vertaald naar een encoded string.   In het oorspronkelijke systeem werden de karakters vervangen door hun altenatieve schrijfwijze &ueml; -> ue. Dit is echter een nogal dure bewerking en daarom is ervoor gekozen dit niet meer te doen..

Waar zijn de karakters/leestekens heen?

Sommige elementen in feeds bevatten leestekens, sommige van de leestekens kunnen ergens in de keten van MySQL/php/joomla/html problemen veroorzaken.

Het gaat om : '/-:&"?_+

De ' en " zijn lastig met MySQL, de /,?,+ en & kunnen problemen veroorzaken in de URL. De - en : worden door joomla op een bijzondere manier behandelt in verband met het SEF systeem.

Daarom worden deze tekens vervangen door een spatie ( ` in geval van ') voordat elementen ( selecties/menu items) aan de MySQL database worden  toegevoegd.

In de callback functie zijn de leestekens nog niet aangepast. Als je op de site bijvoorbeeld 'Nieuw Zeeland' hebt staan kan dat zijn oorsprong hebben in 'Nieuw-Zeeland' of 'Nieuw Zeeland'.

En umlauten en karakteres met trema's en zo?

Het is toegestaan umlauten en soortgelijke karakters in de URI op te nemen, soms wordt de URI dan vertaald naar een encoded string.   In het oorspronkelijke systeem werden de karakters vervangen door hun altenatieve schrijfwijze &ueml; -> ue. Dit is echter een nogal dure bewerking en daarom is ervoor gekozen dit niet meer te doen..

Combineren met wordpress

Er zijn op dit moment geen plannen de component naar wordpress om te bouwen.

 

Het is echter wel mogelijk de  producten vanaf een joomla datafeeds site te gebruiken in een wordpress site.

Zie bijvoorbeeld sneeuwwandelen in Oostenrijk.

Als je eenmaal de joomla datafeeds draaiende hebt, is het integreren in wordpress vrij eenvoudig.

De noodzakelijke scripts worden aangeboden als (betaald) maatwerk.

Neem contact op als je belangstelling hebt.

 

 

 

  

 

mod_datamenu

Deze module kan gebruikt worden voor:

  • weergeven van een menu
  • plaatsen van tekst of links  bij een com_datafeeds menu : zie dit artikel
  • weergeven van een toplijst.

De module werkt altijd samen met een com_datafeeds menu . Dit menu definieert het filter waarmee in de database gezocht wordt.

De opties

Niet alle opties worden voor alle layouts gebruikt.

Algorithm Selectie methode van menu items ( zie onder ) in menu layouts
prefix Om verschillende artikele/links te kunnen toevoegen zie dit artikel
Default ID Wijst naar een com_datafeed menu. Als de module op een pagina weergegeven wordt waar geen datafeeds menu aanwezig is wordt dit menu item gebruik. Het is ook mogelijk om het gebruik van een bepaalt menu te forceren door een min-teken te gebruiken
Table grid Aantal  kolommen dat naast elkaar gezet moet worden. Wordt bijvoorbeeld gebruikt in de search layout. Als je hier 2 kiest met levels op 8 krijg je een tabel van 2 kolomen en 4 rijen.
Number of levels Aantal subniveau's dat getoond gaat worden(zie onder)
Number of items Aantal items dat in niet top niveau's getoond gaat worden (zie onder)
Sorteer Niveau 0 Sorteer optie (gebruikt bij lijsten)
Volgorde Sorteer volgorde (gebruikt bij lijsten)
Advanced tab
Neven Hoofdselectie/value's Analoog aan de hoofdselectie bij de menu configuratie kan hier weer een kleine selectie gemaakt worden. De combinate merchant/esprit zal alleen de items uit de esprit feed laten zien

Menu niveau's en aantallen.

Gegeven de volgende data

  • Frankrijk
    • Elzas
    • Provence
    • Parijs
      • Single Reis
  • Spanje
    • Andalusie
    • Costa Brava

In de beginsituatie zal het menu zo weergeven worden:

Niveau/Menu 1

  • Frankrijk
  • Spanje

Niveau/Menu 2

  • Elzas
  • Andalusie

Niveau/Menu 3

  • Single Reis

Hierbij is  Number of items ingesteld op 2. Het tweede menu niveau zonder selectie ( dat is in de beginstand niveau 2 ) geeft dan maximaal Number of items weer gebaseerd op hits.

Stel jeer wordt nu Frankrijk geselecteerd. ( niveau drie even buiten beschouwing )

Minimaal Smart
Maximaal

Niveau 1

  • Frankrijk

Niveau 2

  • Elzas
  • Provence
  • Parijs

 

Niveau 1

  • Frankrijk
  • Spanje

Niveau 2

  • Elzas
  • Provence
  • Parijs
Niveau 1
  • Frankrijk
  • Spanje
Niveau 2
  • Elzas
  • Provence
  • Parijs
  • Andaluesie
  • Costa Brava

Bij een keuze voor 'Maximaal' is er kans op selectis die niets opleveren.

 

Automatische Keuze

Stel in de begin situatie wordt in het derde menu voor 'single reis' gekozen, de enige optie die er dan voor nivuea  1 en 2 is Frankrijk,Parijs. Er is geen keuze en het item is niet te selecteren

Geen keuze

Stel in de begin situatie wordt in het eerste menu 'Spanje' gekozen. Er is dan voor niveau 3 geen keuze meer met de Algomitmes 'Minimaal' en 'Smart'

Custom layout

De module staat het toe eenvoudig andere layouts toe te voegen.

Stel je wilt het menu aanpassen aan je eigen wensen. Kopier bijvoorbeeld default.php naar bijvoorbeeld mijnmenu.php Vervang in het script in de classnaam 'default' door 'mijnmenu' en pas het script verder aan. Dus de naam van de class is Data<filename>Menu. Selecteer je scripts als layout.

De layouts zijn er in drie varianten, menu's, lijsten en custom.  Om een custom layout voor een lijst te maken moet de bestandsnaam eindigen in _list.php. Bij een custom layout eindigd de naam op _custom. Bij een lijst en een menu wordt een ingebouwde query uitgevoerd. Bij een custom layout moet je het helemaal zelf doen.

 

 

{include_code_listing /var/www/www.affiliatefeeds.nl/images/code/count_custom.txt}

 

Default ID

De module mod_datamenu verwijst altijd naar een datafeeds->items menu. Als de module weergegeven wordt op een datafeeds->items menu pagina dan gebruikt de module automatisch de instellingen/filters van die pagina. Als de module geplaatst is op een pagina die geen datafeeds-items is dan heeft de module geen instellingen en kan niets weergeven worden. Om toch op een willekeurige pagina een zoekmodule of een toplijst te kunnen weergeven gebruik je de default id.

In het voorbeeld rechts is de startpagina een gewoon artikel, stel je wilt op deze pagina op een module positie een toplijst van Vakanties en reizen aanmaken. In de module parameters komt dan in default-id '36' te staan. Wil je zowel een toplijst van zowel de vakanties als wintersport dan wordt het '36,45'.

Of je wilt op de vakantie pagina juist wel een toplijst van de wintersport. Gewoonlijk zou de module automatisch de top lijst van het eigen datafeeds menu overnemen. Vul voor de default-id een negatieve waarde in om de relatie met een datafeeds-items menu te fixeren : '-45'

Met de plugin loadposition ( core joomla ) kun je de module ook willekeurig in een artikel weergeven.

 

Tips

  1. De module gebruikt diverse instellingen van het betreffende menu item. Zo onder andere de headings voor de menu's. (tot versie 346 in het  Advanced Tab van de instellingen)
  2. Je kunt de module meerdere keren onder elkaar plaatsen door  meerdere default ids op te geven 36,45 of beter -36,-45 ( dan staan ze er onafhankelijk van het menu item )
  3. Sommige custom layouts geven titels weer van de betreffende component. Dit is niet zoals wellicht te verwachten de titel linksboven in de menu instellingen (dat is namelijk de naam van het menu-item), maar de titel rechts onder bij de systeem parameters.
  4. Wil je altijd eerst de lijst/menu van het huidige datafeeds menu en dan de rest. Gebruik dan eerst een nul: 0,-36,-45

 

 

com_datafeeds en smartsef

Smartsef werkt niet goed samen met een aantal varianten van de module. Smartsef past url's aan onder andere de spaties. Hierdoor werken de queries niet meer.

Smartsef voor joomla 1.5 is al een tijdje niet onderhouden, de smartsef site werkt niet en de extension komt niet meer voor op extensions.joomla.org. Er zijn aanpassingen geweest in joomla sinds de laatste versie van smartsef. Dit zijn al een aantal redenen om smartsef niet meer te gebruiken. In ieder geval een reden om op dit moment geen tijd een smartsef te willen steken.

Er zijn aan aantal situaties waarin smartsef wellicht toegevoegde waarde heeft, voor joomla 1.0 had het dat zeker. Joomla is een stuk beter geworden in het maken van 'Search Engine Friendly' Url's en zoekmachines zijn heel veel beter geworden in het verwerken van de zoekmachine onvriendelijke URL's. Er is zeker nog wat voor de tegen om de Url's een wat fraaier uiterlijk te geven maar de term HRF ( Human Reader Friendly) zou veel beter zijn. 

 

Een zeer ernstig probleem met smartsef is dat na het purgen van de database je complete site onvindbaar is !

Een aantal zaken die smartsef regelt ( bijvoorbeeld de beroerde error meldingen in joomla-core ) zijn ook via de template en .htaccess te regele.

Com_datafeeds doet aardig zijn best om de url vriendelijk te maken, daar is eigenlijk geen rewritting meer voor nodig. Een probleem met com_datafeeds is is dat er heel veel links zijn, en dus de url-repository van smartsef nogal groot wordt. Overhead die ik je kan afraden.


 

com_datafeeds en smartsef

Smartsef werkt niet goed samen met een aantal varianten van de module. Smartsef past url's aan onder andere de spaties. Hierdoor werken de queries niet meer.

Smartsef voor joomla 1.5 is al een tijdje niet onderhouden, de smartsef site werkt niet en de extension komt niet meer voor op extensions.joomla.org. Er zijn aanpassingen geweest in joomla sinds de laatste versie van smartsef. Dit zijn al een aantal redenen om smartsef niet meer te gebruiken. In ieder geval een reden om op dit moment geen tijd een smartsef te willen steken.

Er zijn aan aantal situaties waarin smartsef wellicht toegevoegde waarde heeft, voor joomla 1.0 had het dat zeker. Joomla is een stuk beter geworden in het maken van 'Search Engine Friendly' Url's en zoekmachines zijn heel veel beter geworden in het verwerken van de zoekmachine onvriendelijke URL's. Er is zeker nog wat voor de tegen om de Url's een wat fraaier uiterlijk te geven maar de term HRF ( Human Reader Friendly) zou veel beter zijn. 

 

Een zeer ernstig probleem met smartsef is dat na het purgen van de database je complete site onvindbaar is !

Een aantal zaken die smartsef regelt ( bijvoorbeeld de beroerde error meldingen in joomla-core ) zijn ook via de template en .htaccess te regele.

Com_datafeeds doet aardig zijn best om de url vriendelijk te maken, daar is eigenlijk geen rewritting meer voor nodig. Een probleem met com_datafeeds is is dat er heel veel links zijn, en dus de url-repository van smartsef nogal groot wordt. Overhead die ik je kan afraden.


 

Case : Pharos feed

Vaak is het nodig de informatie in de feeds wat aan te passen, ISO-codes naar land informatie. Beschrijving inkorten of bijvoorbeeld een foutieve codering repareren. Voor deze aanpassingen is het mogelijk voor elke feed een callback functie te maken.

 

De Pharos feed

De gewone pharos feed ( tradetracker ) kent een tweetal problemen, ten eerste staat in sommige landennamen de aanduiding 'winter'. Daarnaast staan in de feed zowel gewonen reizen, stedentrips en wintersport reizen door elkaar. Onderstaand een voorbeeld van een callback functie om deze te repareren.


Read more …Case : Pharos feed

Systeem eisen

In principe heeft de parser dezelfde systeemeisen als joomla 1.5 :

  • Joomla 1.5.12 of nieuwer (de component wordt steeds getest met de laatste versie van joomla)
  • PHP 4.2.x of nieuwer
  • MySQL 3.23.x of nieuwer
  • Apache 1.3.x of nieuwer
  • allow_url_fopen aan of curl + uitgaande http

Test Script

Eenvoudig test script op basis vereisten te testen: req-test.php, uitpakken, en het php bestaand ergens op je server neerzetten  en opvragen

 

Beperkingen mysql php versies

I.v.m. de verschillende character coderingen en het werken met bijzondere tekens zijn er wat haken en hogen. Het mooiste is als de database collatie ondersteund  (mySQL >= 4.1.2). Lager kan maar dan is het echter wel nodig dat de php versie UTF-8 goed ondersteund. ( dat is vanaf php 5).

Daarnaast ondersteunen oudere versies van mySQL de 'on update' syntax niet, er is dan een aangepaste (inefficientere versie van het import script nodig)

Er zijn wat aanpassingen nodig om de component goed te laten werken in geval van een oude database versie.

Als je een grote website gaat maken en of alle vrijheid wilt inclusief CLI en in eigen beheer van de cron is het gebruik van een VPS zeer aan te raden

 

 

Curl issues

  • Curl heeft een cache directory nodig. administrator/cache moet schrijfbaar zijn voor de webserver.
  • Als de uiteindelijke feed opgehaald wordt via een redirect (301/302) kan curl deze redirect alleen volgen als er geen beperkingen zijn op safe_mode en open_basedir. Dit treedt bijvoorbeeld op bij de automatische configuratie van daisycon

libxml php bug

Versies libxml 2.7.1 en 2.7.2 leveren problemen op in combinatie met de xml parser van php.

Zie PHP en LibXML bug.