Hi!
Ich bin schon ein gutes Stück weiter, und weiß jetzt, dass ich die POST Daten mit einer Pipe in das Script bringen kann (echo POSTDATEN | php file.php)
Das würde ich nicht machen, die POST-Daten können schonmal etwas größer sein und dann kannst Du so probleme bekommen (ist mir mal passiert). ich würde eine bidirektionale pipe öffnen, so dass Du direkt auf STDIN schreiben kannst, und STDOUT auslesen.
und für die GET Daten setze ich eine Umgebungsvariable. Im Script kann ich auch bereits auf die Daten mittels $_ENV['QUERY_STRING'] und $fp = fopen("C://stdin", "r") zugreifen. Nur funktionieren die Arrays $_GET[] und $_POST immer noch nicht. Meine einzige Frage is nun, wie fülle ich diese Arrays?
AFAIK erstellt PHP diese Arrays mit Hilfe der gesetzten Umgebungsvariablen. Ich würde mir mal den PHP-Source ansehen, das hae ich gerade mal gemacht.
Z.B. findest Du da solche Dinge in der Datei cgi_main.c im Verzeichnis cgi in Zeile 983:
/* Make sure we detect we are a cgi - a bit redundancy here,
but the default case is that we have to check only the first one. */
if (getenv("SERVER_SOFTWARE")
|| getenv("SERVER_NAME")
|| getenv("GATEWAY_INTERFACE")
|| getenv("REQUEST_METHOD")) {
cgi = 1;
}
Das heißt obige Variablen müssen (korrekt) gesetzt sein, da PHP sonst nicht versucht wie in der CGI-spec. auf die Umgebungsvariablen zuzugreifen. Was Du machst ist PHP ohne jegliches Konzept anzusprechen, klar bekommst Du dann mit tricks Variablen aus den Umgebungsvariablen und STDIN, aber darum geht es nicht. Du brauchst eien definierte3 Schnittstelle wo für Dich nur CGI in Frage kommt. Hierzu musst Du a) Wissen wie die Schnittstelle funktioniert(also Welche Variablen wie gesetzt werden, was wie übergeben/angesprochen wird...). Der Einfachheit halbe kannst Du Dir auch im PHP-Source ansehen was genau gefprdert wird. Oben das ist nur ein Beispiel. Es gibt sicher noch weitere Hürden, am sichersten wäre es daher eine korrekte CGI-Schnittstelle zu implementieren. Das ist glaube ich gar nicht so schwer. Also so ganz komm eich mit dem Code nicht klar, auf alle Fälle werden GET-Variablen automatisch aus dem QUERY_STRING extrahiert, naja, aber ich habe nicht wirklich herausbekommen können unter welchen Voraussetzungen das passiert.
Also ich habe mir mal die genaus CGI-Spezifikation angesehen, die ist gar nicht so lang und recht einfach zu verstehen. Ich habe das in wengen Minuten überflogen udn kann sagen da steht alles drin was Du wisen musst.
Da steht z.B.:
Servers MUST provide the following metavariables to scripts. See the individual descriptions for exceptions and semantics.
CONTENT_LENGTH
CONTENT_TYPE
GATEWAY_INTERFACE
PATH_INFO
QUERY_STRING
REMOTE_ADDR
REQUEST_METHOD
SCRIPT_NAME
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
Mit genauen Angaben wie diese Variabnlen auszusehen haben und wie sie übergeben werden sollten. Diese Variablen solltest Du recht einfach setzen können und schon sollte es gehen!
da steht z.B. auch dass ein Script welches CGI verwendet(also auch die PHP-Implamentation) vor jeder Antwort den Inhalt von REQUEST_METHOD prüfen soll, und das hast Du schonmal nicht gesetzt.
PHP im Speziallen prüpft mindestens(!) SERVER_SOFTWARE, SERVER_NAME, GATEWAY_INTERFACE und REQUEST_METHOD bevor es überhaupt irgendwas in Richtung CGI tut. Kann sein dass später noch mehr geprüft ist, was sogar sehr wahrscheinlich ist. Also, setze obige Umgebungsvariablen korrekt und es sollte funktionieren.
lies: http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html
und implementiere das danach! Und lies es komplett bis Du alles verstanden hast, das wird nicht lange dauern.
Immerhin hast Du dann eine richtige CGI-Schnittstelle mit der Du dann auch PERL usw. ansprechen kannst! Und ohne wirst Du PHP nicht anständig zum laufen bekommen, denn die Alternative ist eine eigene SAPI zu schreiben, was sicherlich erheblich aufwändiger ist!
Viele Grüße
Andreas
PS: Kannst Du mir verraten wie Du in Java Umgebungsvariablen setzt? Ist das identisch für Windows und Unix? Und sag Bescheid ob es funktioniert :-)