![]() |
Mehrere CGI-Scripts und POST
Ich möchte mei meinem Server CGI-Programme erlauben (das wichjtigste ist zweifelsohne das von PHP 8) )
Bereits beim PHP-CGI habe ich probleme mit POST gehabt. Inzwischen habe ich die Lösung: Zitat:
Hat jemand eine Idee, wie man dieses Problem umgehen kann? Wie kann ich mehrere CGI-Scripts gleichzeitig aufrufen, ohne, dass "Fehler" vorkommen? Ich musste bereits lernen, dass man sich in solchen Fällen nicht auf die geringe Wahrscheinlichkeit verlassen kann. In anderen Worten: Auch random($7FFFFFFF) = $AFFE ergibt mal true. //Edit: Thema umbenannt von "Mehrere CGI-Scripts gleichzeitig" |
Re: Mehrere CGI-Scripts gleichzeitig
Habe eben bemerkt, dass jeder Prozess bei WIN seine eige´nen Umgebungsvariablen hat.
Jetzt hier mein Code:
Delphi-Quellcode:
...
function GetConsoleOutput(const Command, Input: String; out Output, Errors: String; const Environment: String): Boolean;
//Von Delphi-Source.de //angepasst von FAlter ([url]http://www.falter.de.tf/[/url]) var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; PipeOutputRead: THandle; PipeOutputWrite: THandle; PipeInputWrite: THandle; PipeInputRead: THandle; PipeErrorsRead: THandle; PipeErrorsWrite: THandle; Succeed: Boolean; Buffer: array [0..255] of Char; NumberOfBytesRead: DWORD; Stream: TMemoryStream; begin Output := ''; Errors := ''; //Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); //Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.bInheritHandle := true; SecurityAttr.lpSecurityDescriptor := nil; //Pipes erzeugen CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); CreatePipe(PipeInputRead, PipeInputWrite, @SecurityAttr, 0); WriteFile(PipeInputWrite, Input[1], Length(Input), NumberOfBytesRead, nil); //Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb:=SizeOf(StartupInfo); StartupInfo.hStdInput := PipeInputRead; StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; StartupInfo.wShowWindow := sw_Hide; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; if CreateProcess(nil, PChar(command), nil, nil, true, CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, PChar(Environment), nil, StartupInfo, ProcessInfo) then begin result:=true; //Write-Pipes schließen CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsWrite); CloseHandle(PipeInputWrite); CloseHandle(PipeInputRead); //Ausgabe Read-Pipe auslesen Stream := TMemoryStream.Create; try while true do begin succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; SetLength(Output, Stream.Size); if Stream.Size > 0 then Stream.Read(Output[1], Stream.Size) finally Stream.Free; end; CloseHandle(PipeOutputRead); //Fehler Read-Pipe auslesen Stream := TMemoryStream.Create; try while true do begin succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil); if not succeed then break; Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; SetLength(Errors, Stream.Size); if Stream.Size > 0 then Stream.Read(Errors[1], Stream.Size) finally Stream.Free; end; CloseHandle(PipeErrorsRead); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end else begin result:=false; CloseHandle(PipeOutputRead); CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsRead); CloseHandle(PipeErrorsWrite); end; end;
Delphi-Quellcode:
Trotzdem funktionieren die POST-Daten noch nicht. Kann jemand einen Fehler entdecken?
Environment :=
'CONTENT_LENGTH=' + IntToStr(Length(ARequestInfo.FormParams)) + #0 + 'SERVER_SOFTWARE=' + IdHTTPServer.ServerSoftware + #0 + 'REDIRECT_STATUS=' + 'ALLOWED' + #0 + 'PATH_TRANSLATED=' + PHP + #0 + 'QUERY_STRING=' + ARequestInfo.QueryParams + #0 + 'SERVER_NAME=' + ARequestInfo.Host + #0 + 'GATEWAY_INTERFACE=' + 'CGI/1.0' + #0 + //Oder was kommt hier hin? 'SERVER_PROTOCOL=' + ARequestInfo.Version + #0 + 'SERVER_PORT=' + '80' + #0 + 'REQUEST_METHOD=' + ARequestInfo.Command + #0 + //'PATH_INFO=' + '???' + #0 + 'SCRIPT_NAME=' + ARequestInfo.Document + #0 + //'REMOTE_HOST=' + '???'+ #0 + 'REMOTE_ADDR=' + ARequestInfo.RemoteIP + #0 + //'AUTH_TYPE=' + '???' + #0 + 'REMOTE_USER=' + ARequestInfo.AuthUsername + #0 + 'HTTP_ACCEPT=' + ARequestInfo.Accept + #0 + 'HTTP_USER_AGENT=' + ARequestInfo.UserAgent + #0 + #0; GetConsoleOutput('"' + filtxtPHP.Text + '"' , ARequestInfo.FormParams, Output, Error, Environment); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz