Hallo,
Ich möchte mit Perl ein CGI-Script programieren (das unter
allen Betriebsystemen laufen soll), in dem ein weiteres
Script gestartet wird, das entweder direkt als Textdatei
(wie normal) vorliegt oder in einer DB liegt. Dieses Scipt
kann (meistens) nicht von mir beeinflusst werden und muss
daher irgendwie die erforderlichen Daten die mit Get oder
Post, die leider (aber logischerweise) an das
übergeordnete Script übergeben werden, bekommen.
Dazu kommt noch, das der Output der "Untergeordneten"
Script verändert werden muss, da diese
- eine Session Id beinhalten soll, da ich keine Cookies
mag und ich diese User identifizieren will.- Die Links des untergeordneten Scripts sollen wieder das
Programm starten (nur mit Parametern, dass der Output
des/der "Untergeordneten" Sripte angezeigt werden soll)
da ich keine Frames benutzen will, aber nicht immer in
alle Scripte das aussehen der restlichen Seite schreiben
will (abgesehen davon das ich nicht alle Scripte
geschreieben habe und Einfluss darauf habe).
Das ganze soll also eine Art CMS werden.
Nunja. Das mit dem Script halte ich fuer absolut bescheiden,
aber egal :)
Mein bisheriger Lösungsansatz:
Ich führe das untergeordnete Script mittels eval() aus und
übergebe die für das untergeordnete Programm bestimmten
Parameter in dem ich Lokal den Hash ENV manipuliere (für
Get Daten). Das funktioniert auch gut, aber die Post Daten
muss das "Untergeordnete" Script ja auch bekommen. Bisher
habe ich diese Daten einfach mit den Get Daten
übermittelt, was bei einigermaßen intelligenten kein
Problem ist, aber einige der Scripte sind leider so
geschrieben dass sie nur POST benutzen. Hätte dafür jemand
eine Idee?
Zweites Problem ist, das ich den in deen "Untergeordneten)
progrämmchen mit print (STDOUT) ausgegebenen Text noch
aus den oben genannten Gründen verändern muss. Dafür habe
ich bisher noch keinen Lösungsansatz. Kann man STDOUT
eventuell in eine Variable umleiten? Wenn ja, wie?
Interessantes Problem. Dir koennte vielleicht 'perldoc
perlipc' weiterhelfen. Da wird ein Konstrukt vorgestellt:
my $pid = open(PID_TO_WRITE,'|-');
die "argh! could not fork!" unless defined $pid;
if($pid) {
print PID_TO_WRITE @some_data;
close(PID_TO_WRITE) || warn "child exited with $?\n";
}
else {
open(FILE,">/safe/file") or die "can't open: $!";
while(<STDIN>) {
print FILE;
}
close FILE;
exit;
}
Das koenntest du nutzen. Beispiel:
ENV-Manipulationen des query strings
my $pid = open(CHLD,'|-');
die "Hey, I could not fork! Error was: $!" unless defined $pid;
if($pid) {
if($ENV{REQUEST_METHOD} eq 'POST') {
print CHLD $data; # $data sind die eingelesenen Daten
}
while(<CHLD>) {
# Transformationen des Outputs
print;
}
}
else {
my $cgi = new CGI;
# blahr, blub
print "some data!\n";
exit; # nicht vergessen! Wichtig!
}
Damit solltest du deine Probleme eigentlich loesen koennen.
Gruesse,
CK