Hallo zusammen,
ich bin gerade dabei einen kleinen Webserver für Testzwecke in C# zu programmieren. Soweit funktioniert auch alles (es gibt ja im Internet auch reichlich Tutorials dazu 😁 ). Nun wollte ich als nächstes gerne PHP einbauen. Dazu rufe ich die Datei php-cgi.exe auf. Als Parameter übergebe ich den Dateinamen. Für Anwendungen ohne GET und POST funktioniert es. Für CGI funktioniert es nun auch. Wenn ich jedoch POST verwende, dann funktioniert nichts mehr. Ich habe zum testen ein kleines HTML-Skript erstellt, welches dann eine PHP-Datei "aufruft". Im PHP-Skript rufe ich die phpinfo() auf. Dort kann man ja dann auch sehen, ob GET- oder POST-Variablen mit übergeben wurde. Bei GET erhalte ich die vollständige phpinfo() inkl. den GET-Variablen. Bei POST sieht das anders aus. Unter dem Abschnitt "Environment" und "PHP Variables" fehlen jeweils über die Hälfte der Variablen. Obwohl ich an dennen ja eigentlich nichts gemacht habe!? Bei Environment erhalte ich nur "alluserprofile", "appdata", "asl.log" und "body". Bei den "PHP Variables" fehlen auch einige, wie z. B. fast alle SERVER-Variablen.
Meine Frage ist nun, wie rufe ich die php-cgi.exe richtig auf, sodass auch POST funktioniert. Ich habe gelesen, dass man einige Environment-Variablen übergeben muss. Mein Code sieht zurzeit so aus:
Process compilerProcess = new Process();
ProcessStartInfo compilerProcessInfo = new ProcessStartInfo(config.PhpExe);
if (HttpMethod == "GET")
{
compilerProcessInfo.Arguments = " -f \"" + RealDirFull + "\" -- \"" + RequestCommand + "\"";
}
else
{
compilerProcessInfo.EnvironmentVariables.Add("CONTENT_LENGTH", RequestCommand.Length.ToString());
compilerProcessInfo.EnvironmentVariables.Add("CONTENT_TYPE", "application/x-www-form-urlencoded");
compilerProcessInfo.EnvironmentVariables.Add("GATEWAY_INTERFACE", "CGI/1.1");
compilerProcessInfo.EnvironmentVariables.Add("PATH_INFO", "");
compilerProcessInfo.EnvironmentVariables.Add("QUERY_STRING", RequestCommand);
compilerProcessInfo.EnvironmentVariables.Add("REMOTE_ADDR", sock.RemoteEndPoint.ToString());
compilerProcessInfo.EnvironmentVariables.Add("REQUEST_METHOD", HttpMethod);
compilerProcessInfo.EnvironmentVariables.Add("SCRIPT_NAME", RealDirFull);
compilerProcessInfo.EnvironmentVariables.Add("SERVER_NAME", Host);
compilerProcessInfo.EnvironmentVariables.Add("SERVER_PORT", (phplistener ? config.MysqlPhpPort : config.Port).ToString());
compilerProcessInfo.EnvironmentVariables.Add("SERVER_PROTOCOL", HttpVers);
compilerProcessInfo.EnvironmentVariables.Add("SERVER_SOFTWARE", "WSL-System V 1.0");
compilerProcessInfo.EnvironmentVariables.Add("BODY", RequestCommand);
compilerProcessInfo.Arguments = " -f \"" + RealDirFull + "\"";
}
compilerProcessInfo.UseShellExecute = false;
compilerProcessInfo.RedirectStandardOutput = true;
compilerProcessInfo.CreateNoWindow = true;
compilerProcess.StartInfo = compilerProcessInfo;
compilerProcess.Start();
string compilerString = compilerProcess.StandardOutput.ReadToEnd();
compilerProcess.Close();
File.WriteAllText(config.PrivateDir + "phpcache.html", compilerString);
RealDirFull = config.PrivateDir + "phpcache.html";
FileMimeType = config.PhpMimeTyp;
Hat jemand eine Idee?
Ich bin dankbar für jeden Ratschlag =)
P.S.: Ich habe fast den ganzen gestrigen Tag mit suchen verbracht!
Wenn ich mich richtig erinnere, musst du den Content des Post Requests in den StandardInput-Stream schreiben, also anstatt compilerProcessInfo.EnvironmentVariables.Add("BODY", RequestCommand);
sollte es so aussehen: compilerProcess.StandardInput.Write(RequestCommand)
nachdem du den Prozess gestartet hast. Vielleicht geht aber auch beides.
Fehler der php-cgi.exe stehen im StandardError-Stream, den solltest du also auch auslesen um zu sehen was du falsch machst.
Danke schonmal.
Es hat mir schon ein wenig weitergeholfen. Jedoch habe ich immer noch ein Problem: Die GET- und POST-Seite wird jetzt angezeigt. Bei der POST-Seite werden die Variablen jedoch als GET erkannt. Die vordefinierte Umgebungsvariable "REQUEST_METHOD" wird nicht angezeigt, obwohl sie gesetzt wurde.
Hast du eine Idee?
Bist Du in einem PHP Forum mit solch spezifischen Fragen nicht vielleicht besser aufgehoben?
Die können Dir mit Sicherheit mehr über die Requirements der PHP Exe sagen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
OK. Ich hab die Frage mal in einem PHP-Forum gestellt: http://www.php.de/server-hosting-und-workstations/106534-php-cgi-exe-post-daten-senden.html
Ich hoffe aber auch noch hier auf eine Antwort! =)