Portierungen von CGI-Anwendungen nach FastCGI
Die Portierung eines CGI-Programmes nach FastCGI ist vom Ansatz her einfach, die Feinheiten der Speicherverwaltung und Programmabläufe sollte allerdings gründlich überarbeitet werden, um die Möglichkeiten von FastCGI voll zu nutzen.
Anpassen von int main()
Als Erster Schritt muss die Funktion main() überarbeitet werden, um das Programm in die FCGI_Accept() - Schleife zu bringen.
Hierbei wird nach der initialisierung der Variablen die Schleife eingefügt und vor dem abschliessenden return die Schleife wieder geschlossen:
Vorher
#include <stdio.h>
int main(void)
{
int a = 0;
// weitere Initialisierungen
// Block mit Programmcode
return 0;
}
Nacher
#include <stdio.h>
int main(void)
{
int a = 0;
// weitere Initialisierungen
while(FCGI_Accept() >= 0)
{
// Block mit Programmcode
}
return 0;
}
Ersetzen der Header
Die bisher eingesetzte Header-Datei stdio.h muss in allen Dateien durch die Datei fcgi_stdio.h ersetzt werden. Diese Arbeit kann durch zwei Befehle auf der Kommandozeile erledigt werden:
TTY
you@host > for file in `find . -name '*.c'`; do perl -pi -e 's/\<stdio\.h\>/\<fcgi_stdio\.h\>/g' $file; done
you@host > for file in `find . -name '*.h'`; do perl -pi -e 's/\<stdio\.h\>/\<fcgi_stdio\.h\>/g' $file; done
Ab jetzt sollte das Programm nach einem Neuübersetzen und Linken gegen libfcgi als FastCGI-Anwendung lauffähig sein.
Die Feinarbeiten
Hier wirds knifflig. Das Programm sollte genauestens analysiert werden und Initialisierungen und ähnliche Schritte, die bei jedem Aufruf gleich sind sollten vor die Schleife verschoben werden, um das Programm weiter zu beschleunigen.
Das Programm sollte genauestens debuggt werden, um Speicherfehler zu verhindern und in einer Testumgebung unter Last gesetzt werden. Dies kann z.B. mit curl geschehen:
TTY
you@host > counter=1; while [ "$counter" -lt 1000000 ]; do curl http://localhost/fcgi-bin/index.fcgi&; done 2>&1
Der Speicherbedarf und die CPU Last sollte nun genauestens überprüft werden, um eventuellen Fehlern auf die Schliche zu kommen.
