Laden...

php-cgi.exe aufrufen und POST-Daten übermitteln

Erstellt von SoftDevelop vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.274 Views
S
SoftDevelop Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren
php-cgi.exe aufrufen und POST-Daten übermitteln

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!

D
216 Beiträge seit 2009
vor 10 Jahren

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.

S
SoftDevelop Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

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?

16.834 Beiträge seit 2008
vor 10 Jahren

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.

S
SoftDevelop Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

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! =)