Amavisd-new init-script

Carl on jan 4th 2012 | Tags: ,

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 …

Filed under Mailserver | Reacties uitgeschakeld

Amavisd-new init script problem

Carl on jan 4th 2012 | Tags: ,

Recently I had to reinstall my mailserver, due to the usual f…-up one tends to make as root. After several hours of configuring packages (debian testing) I finally had it up and running. Unfortunately, one of my cronjobs failed. An error restarting amavis after the update of spamassassin. Luckilly, someone already had the solution for the failing init-script.
If you get the following error restarting/stopping amavis:

Stopping amavisd: (not running).
Starting amavisd: The amavisd daemon is already running, PID: [10966] (failed).

Check your /etc/init.d/amavis for the following line:
STOP="--stop --quiet --pidfile $PIDFILE --name ${DAEMONNAME}"
Comment it out like:
# STOP="--stop --quiet --pidfile $PIDFILE --name ${DAEMONNAME}"
and put the next line in:
STOP="--stop --quiet --pidfile $PIDFILE"

Short and sweet: your system is probably running amavisd-new as user amavis or amavisd instead of amavisd-new, as defined in the top of the file. What’s in a DAEMONNAME …
If that doesn’t work … you’ll be in for a nice google-session

Filed under Mail server | Reacties uitgeschakeld

ADODB-change database

Carl on aug 9th 2011 | Tags: ,

In ADODB you cannot use multiple database connections simultaneously. If you need to work cross database, you have two possibilities:

  • Close the existing connection en setup a new one so you can retrieve the required data from the database;
  • Change database.

Examples:
1. New Connection

$dbhandle = new ADONewConnection( $DSN_1 );
... queries etc. ...
$dbhandle->close ();
$dbhandle = new ADONewConnection( $DSN_2 );
... queries etc. ...
etc, etc

2. Change Database

$dbhandle = new ADONewConnection( $DSN_1 );
... queries etc. ...
$dbhandle->SelectDB ( $databasename );
... queries etc. ...

At first sight the differences do not seem to be very big. However, if your database server has a heavy load, it will certainly make a difference. The first option initialises a new connection every time (even with pconnect) and though you closed the previous connection, the latter still needs to timeout on the server. As a database server is no different then e.g. a web server in handling connections, this means you will be running out of connections (max connections in the server configuration), thus your code will be waiting for a response as the requested connections are being queued. Result for the web application … page timeouts.
The second option re-uses the existing connection. It will only switch from one database to the next. This, however, is only possible if the databases you use can be read by the same user from the same host, as you will understand. The bottleneck of this method is your service provider: Does he, if you are not the one providing the service, allow you to select/update/delete in your multiple databases with one account.

Filed under MySQL @en,PHP @en | Reacties uitgeschakeld

ADODB -database wisselen

Carl on jul 26th 2011 | Tags: ,

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).

Filed under MySQL,PHP | Reacties uitgeschakeld

Recursion (php3/4/5.0)

Carl on mrt 2nd 2011 | Tags: ,

Recursion should work fine in the latest versions. However, if it doesn’t read on and try another way …

PHP can be a bitch … One problem you will certainly encounter is when you want to call a function recursively. After you have been sweating on your code for half a day, a day, or maybe even longer, you will find that the initial value of your array|hash is no longer the same. It suddenly has diminished to a single value …

However, you can call a method recursively, not a function. Confusing? Yes, quite, as this means that you will only be able to use recursion in a class/object. It may seem you are writing functions in a class – you define them with ‘function’ – but it is a method your creating.

To call a method recursively, you cannot use the default way you would call a class method: ‘$this->methodname ([all your paramaters]);’. Recursion can only be established with: ‘classname::methodname([all your params);’. If you use the first method ‘$this->…’ you will experience the same frustration as with calling a normal function recursively. However, the second way to call your method – ‘class::method ..’ – puts you variable in a new instance, which does not know an previous values, and thus you can iterate recursively over your array|hash.

P.s. Watch out with static methods/functions

Filed under PHP @en | Reacties uitgeschakeld

Recursie (php3/4/5.0)

Carl on mrt 2nd 2011 | Tags: ,

Recursie zou in de huidge versies van php goed moeten werken. Echter, als dat niet het geval is, lees het onderstaande en probeer het alternatief.

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.

P.s. Let op met static methods.

Filed under PHP | Reacties uitgeschakeld

Class Variables PHP5

Carl on feb 24th 2011 |

One nice quirck in PHP5:

If you write a class and use boolean variables in the class methods, you will need to initialise/declare it at the beginning of your method.

function methodenaam () {
$booleanvar = false;
...
}

If you ommit that, you will have the unexpected experience (in PHP5) that your variable will return ‘false’, even after you are 100% certain, it should be ‘true’. Anyway, it is a sign of good programming to declare/initialise your variables.

Filed under PHP @en | Reacties uitgeschakeld

Class Variabelen PHP5

Carl on feb 24th 2011 |

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.

Filed under PHP | Reacties uitgeschakeld

My Favorite Frameworks

Carl on feb 12th 2011 |

During my time as programmer, I extended my experience (who does not?). One develops oneself, and learns how to program . Thus you define the way you write your code, your preferences, and so did I. That said, I also made use of frameworks. My favorite ones you will find below:

Php/DBS: ADODB, Doctrine
Php: Zend, Symfony
JavaScript: ExtJS (nu Sencha)

Filed under Frameworks @en | Reacties uitgeschakeld

Mijn favoriete frameworks

Carl on feb 12th 2011 |

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/DBS: ADODB, Doctrine
Php: Zend, Symfony
JavaScript: ExtJS (nu Sencha)

Filed under Frameworks | Reacties uitgeschakeld

« Newer Posts - Older Posts »