Recentelijk heb ik mijn mailserver opnieuw moeten installeren, door de gebruikelijke f…-up als root. Na verscheidene uren besteed te hebben aan het configuren van de verschillende ‘packages’ (debian testing), had ik het uiteindelijk aan de praat. Helaas werkte één van mijn cronjobs niet meer. Er verscheen een foutmelding bij het herstertarten van amavisd, nadat spamassassin bijgewerkt was. Gelukkig had iemand anders reeds ditzelfde probleem ondervonden en de ‘fout’ in het script verholpen.
Als je de volgende melding krijgt bij het herstarten of stoppen van amavisd:
Stopping amavisd: (not running).
Starting amavisd: The amavisd daemon is already running, PID: [10966] (failed).
Zoek dan in /etc/init.d/amavis de volgende regel:
STOP="--stop --quiet --pidfile $PIDFILE --name ${DAEMONNAME}"
Commentarieer het alsvolgt uit:
# STOP="--stop --quiet --pidfile $PIDFILE --name ${DAEMONNAME}"
en voeg de volgende regel toe:
STOP="--stop --quiet --pidfile $PIDFILE"
Kortom: Amavisd-new draait op het systeem hoogst waarschijnlijk onder een andere gebruiker dan gedefinïeerd in het script, waarschijnlijk amavis, of amavisd. “What’s in a DAEMONNAME’ …
Als dit niet werkt, dan heb je wat te googlen …
In ADODB kunt u niet meerdere connecties opzetten naar verschillende databases. Indien u cross database tabellen moet uitlezen, zijn er twee opties:
- De bestaande connectie sluiten en een nieuwe connectie opzetten naar de database waaruit u de benodigde gegevens ophaalt;
- Wisselen van database.
Examples:
1. Nieuwe connectie
$dbhandle = new ADONewConnection( $DSN_1 );
... queries e.d. ...
$dbhandle->close ();
$dbhandle = new ADONewConnection( $DSN_2 );
... queries e.d. ...
etc, etc
2. Wisselen van database
$dbhandle = new ADONewConnection( $DSN_1 );
... queries e.d. ...
$dbhandle->SelectDB ( $databasename );
... queries e.d. ...
Op het eerste gezicht lijken de verschillen niet groot. Echter (idd), indien een database server zwaar beproeft wordt, maakt het wel degelijk uit. De eerste optie maakt telkens een nieuwe connectie met de server. De server kan maar een aantal connecties aan (configuratie). Daarbij komt nog eens dat iedere bestaande connectie niet meteen beschikbaar is. Er gaat een korte tijd verloren, voordat de connectie daadwerkelijk wordt vrijgegeven. Op een gegeven moment zijn de connecties dus op en iedee request naar de server komt daarmee in de queue. Voor een website betekend dat ‘timeout’ van de pagina.
De tweede optie maakt telkens gebruik van dezelfde resource/connectie en verandert alleen de database waarnaar deze verwijst. Het is wel van belang dat de databases allemaal toegankelijk zijn voor de gebruiker waarmee ingelogd is op de server. Dat is niet voor alle applicaties/websites mogelijk en afhankelijk van de service provider (indien u dat niet zelf bent).
PHP is soms niet gemakkelijk te doorgronden. Een van de problemen die je als programmeur geheid tegen zal komen is dat je een functie recursief wilt aanroepen. Als je dan je code zover hebt om te testen, kom je er achter dat de waarde van je initïele variabele ineens niet meer hetzelfde is. Je array of hash bevat niet meer dezelfde waarde(n) maar alleen de eerste …
In PHP kan je een methode recursief aanroepen, niet een functie. Verwarrend? Ja, nogal, want dit wil zeggen dat je alleen in een class/object recursief kan werken. Ondanks dat het lijkt dat je functies schrijft in een class – doordat je ‘function’ gebruikt – zijn het methoden.
Het recursief aanroepen van de methode kan je niet op de gebruikelijke manier: ‘$this->methodname ([all your paramaters]);’. Recursie krijg je alleen voorelkaar met ‘classname::methodname([all your params);’. Indien je het met ‘$this->..’ probeert, zal je merken dat je array|hash wederom is teruggebracht naar één waarde. Dat komt omdat je data zich nog in dezelfde instantie/namespace (of hoe je het ook noemen wilt) bevindt. Daardoor wordt je variabele overschreven. Indien je gebruik maakt van ‘class::method ..’, maak je gebruik van een nieuwe instantie van je class, waar die variabele nog niet in voorkomt.
Een andere aardigheid om te weten:
Als je een class schrijft in PHP 5 en je gebruikt booleans in je methoden, moet je deze eerst initialiseren/declareren.
function methodenaam () {
$booleanvar = false;
...
}
Als je dat niet doet, heb je in PHP5 de kans dat je, ongeacht het feit dat je de variabele de waarde ‘true’ meegeeft, ‘false’ terugkrijgt. Het is sowieso goed om van te voren je variabelen vooraf te declareren/initialiseren.
In de loop der tijd heb ik de nodige ervaring opgedaan (wie doet dat niet als programmeur …). Gedurende die tijd ontwikkel je jezelf en leer je jezelf op een bepaalde manier te programmeren. Zo ook ga je grebruik maken van hulpmiddelen, zoals frameworks. Onderstaand tref je een aantal favorieten van mij aan:
Php/MySQL: ADODB
JavaScript: ExtJS (nu Sencha)
Meer en meer FrameWorks worden bij het programmeren gebruikt, zodat je als programmeur sneller (efficïenter) kan werken.Voor een beginnende programmeur is het niet altijd even eenvoudig om zich de werking van een framework eigen te maken – nu ik dit zo schrijf, voor een ervaren programmeur is het ook niet altijd even simpel …
Een van de vele frameworks is dat van Zend. Dit famework bestaat al geruime tijd en is bijzonder veelzijdig. Een goede leerinstructie (tutorial) had ik tot voor kort nog niet gevonden, maar nu ben ik er één tegengekomen die zeker de moeite waard is om door te nemen. Het is een basisleerinstructie waar je als beginner zeker veel uit kan halen. Kijk op www.akrabat.com
Hier geef ik mijn ervaringen en die van mijn (con-)collegea weer, waar je als programmeur tegenaanloopt.
Gegevens waarmee je niet iedere dag te maken hebt – die interessant kunnen zijn om te weten – en die praktisch kunnen zijn om toe te passen …
Veel programmeurs maken gebruik van dubbele aanhalingstekens in hun code. Vaak is de rede dat het eenvoudig is of beter leesbaar. Echter, PHP is een interpreterende taal en zal alles dat tussen dubbele aanhalingstekens staat interpreteren. Dit kan bij het doorlopen van grote hoeveelheden code vertragend werken.
Alles dat u tussen enkele aanhalingstekens schrijft, wordt niet geïnterpreteerd. Dit impliceert dat concateneren snellere code oplevert. Een gegeven dat bij sites met een hoog bezoekersaantal meespeelt.
B.v.:
echo “Welcome to {$_SERVER[''HOST'']} bla bla, $_today”;
echo ‘Welcome to ‘ . $_SERVER['HOST'] . ‘ bla bla, ‘ . $_today;