Laden...

PHP aus C# aufrufen / Umgebungsvariablen

Erstellt von Max Power vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.059 Views
M
Max Power Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren
PHP aus C# aufrufen / Umgebungsvariablen

Hallo zusammen,

ich habe ein Problem beim Aufruf von PHP aus C#. Erstmal ein Minimalbeispiel, bei dem das Problem auftaucht:


static void Main(string[] args)
{
    string app = "C:\\Program Files (x86)\\PHP\\php-cgi.exe";
    string file = "\"D:\\Projekte\\test.php\"";

    Process cgi = new Process();

    //PrintEnvironmentVariables(cgi.StartInfo.EnvironmentVariables);

    cgi.StartInfo.EnvironmentVariables["QUERY_STRING"] = "var1=test1";
    cgi.StartInfo.EnvironmentVariables["REMOTE_ADDR"] = "127.0.0.1";
    //cgi.StartInfo.EnvironmentVariables["SERVER_SOFTWARE"] = "ServerApp";

    //PrintEnvironmentVariables(cgi.StartInfo.EnvironmentVariables);

    cgi.StartInfo.UseShellExecute = false;
    cgi.StartInfo.CreateNoWindow = true;
    cgi.StartInfo.RedirectStandardOutput = true;
    cgi.StartInfo.FileName = app;
    cgi.StartInfo.Arguments = file;

    cgi.Start();

    string output = cgi.StandardOutput.ReadToEnd();

    cgi.WaitForExit(30000);
    cgi.Close();

    Console.WriteLine("\n\nPHP output:\n");

    Console.WriteLine(output);
}

private static void PrintEnvironmentVariables(StringDictionary dict)
{
    Console.WriteLine("\nEnvironment variables:\n");

    foreach (DictionaryEntry item in dict)
    {
        Console.WriteLine(item.Key + " = " + item.Value);
    }
}

Das PHP Skript gibt nur den query string aus:

[PHP]
<?php echo "Query: ".getenv('QUERY_STRING'); ?>
[/PHP]

Die Ausgabe lautet also "var1=test1". Das Problem ist, wenn ich die Zeile


    cgi.StartInfo.EnvironmentVariables["SERVER_SOFTWARE"] = "ServerApp";

nicht auskommentiere, bekomme ich keine Ausgabe mehr. Ich würde gerne wissen

  1. Passiert dasselbe auch bei euch? (ich benutze Win7 x64, PHP 5.3.1)
  2. Hat jemand eine Idee, was da schief läuft?

Außerdem ist mir aufgefallen, dass die Umgebungsvariablen immer lower case sind. Woran liegt das? Ist zwar nicht so das Problem, da z.B. getenv('QUERY_STRING') die Variablen ja findet, aber in $_GET sind halt keine Variablen vorhanden!

Gruß, Max

Gelöschter Account
vor 14 Jahren

Ich kann dir bei deinem Problem leider nicht weiterhelfen aber vielleicht eine Alternative bieten. Ich hab vor kurzem eine Anwendung in C# geschrieben die via Xml Rpc von PHP direkt aufgerufen wurde. Das ist im Prinzip ähnlich einem Webservice. Das ganze ging echt fix und einfach. Genutzt hab ich das hier: http://www.xml-rpc.net

Viele Grüsse!

M
Max Power Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

Hallo nochmal!

Das Problem ist nach wie vor da: die auskommentierten Zeilen führen bei mir dazu, dass PHP nichts mehr ausgibt. Vielleicht könnte jemand so nett sein und einfach mal den folgenden Code laufen lassen (einmal mit und einmal ohne das Auskommentierte). Ich möchte erstmal nur wissen, wie sich das bei euch verhält (bitte OS uns PHP Version mit angeben - mich interessiert natürlich vor allem Win7 x64 und PHP 5.3.1):

Pfad zur exe und zum Skript bitte entsprechend anpassen!


        static void Main(string[] args)
        {
            string app = "C:\\Program Files (x86)\\PHP\\php-cgi.exe";

            Process cgi = new Process();

            cgi.StartInfo.UseShellExecute = false;
            cgi.StartInfo.CreateNoWindow = true;
            cgi.StartInfo.RedirectStandardOutput = true;
            cgi.StartInfo.RedirectStandardInput = true;
            cgi.StartInfo.FileName = app;

            //cgi.StartInfo.EnvironmentVariables["SERVER_SOFTWARE"] = "ConsoleApp";
            //cgi.StartInfo.EnvironmentVariables["SERVER_NAME"] = "localhost";
            //cgi.StartInfo.EnvironmentVariables["SERVER_PORT"] = "80";
            //cgi.StartInfo.EnvironmentVariables["SERVER_PROTOCOL"] = "HTTP/1.1";

            //cgi.StartInfo.EnvironmentVariables["REQUEST_METHOD"] = "POST";
            //cgi.StartInfo.EnvironmentVariables["GATEWAY_INTERFACE"] = "CGI/1.1";
            
            cgi.StartInfo.EnvironmentVariables["HTTP_REFERER"] = "http://www.server.com/example.html";
            cgi.StartInfo.EnvironmentVariables["HTTP_FROM"] = "example@server.com";
            cgi.StartInfo.EnvironmentVariables["HTTP_HOST"] = "www.host.com";
            cgi.StartInfo.EnvironmentVariables["HTTP_USER_AGENT"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
            cgi.StartInfo.EnvironmentVariables["HTTP_ACCEPT"] = "text/plain, text/html";

            cgi.StartInfo.EnvironmentVariables["PATH_INFO"] = "D:\\Projekte\\test.php";
            cgi.StartInfo.EnvironmentVariables["PATH_TRANSLATED"] = "D:\\Projekte\\test.php";
            cgi.StartInfo.EnvironmentVariables["SCRIPT_NAME"] = "test.php";
            cgi.StartInfo.EnvironmentVariables["SCRIPT_FILENAME"] = "D:\\Projekte\\test.php";

            cgi.StartInfo.EnvironmentVariables["QUERY_STRING"] = "var1=get-data&var2=test";
            cgi.StartInfo.EnvironmentVariables["REMOTE_ADDR"] = "127.0.0.1";
            cgi.StartInfo.EnvironmentVariables["REMOTE_HOST"] = "localhost";

            string post = "var1=post-data&var2=test";

            cgi.StartInfo.EnvironmentVariables["CONTENT_TYPE"] = "application/x-www-form-urlencoded";
            cgi.StartInfo.EnvironmentVariables["CONTENT_LENGTH"] = post.Length.ToString();

            cgi.Start();

            cgi.StandardInput.WriteLine(post);
            cgi.StandardInput.Close();
            cgi.WaitForExit(1000);

            Console.WriteLine(cgi.StandardOutput.ReadToEnd());

            cgi.Close();
        }

[PHP]
<?php

echo "GET "; print_r($_GET);
echo "\nPOST "; print_r($_POST);

?>
[/PHP]

Ausgabe des obigen Codes:


X-Powered-By: PHP/5.3.1
Content-type: text/html

GET Array
(
    [var1] => get-data
    [var2] => test
)

POST Array
(
)

Ausgabe, falls eine der auskommentierten Zeilen mit ausgeführt wird:



MfG, Max

T
307 Beiträge seit 2008
vor 14 Jahren

Hallo Max Power,
also wenn ich Deinen zuletzt geposteten Code nehme bringt er mir das selbe Ergebnis wie bei Dir. Aber das ist ja auch richtig so weil Du dort in dem Query-String ja diese Variablen setzt.
Ich verstehe das Problem nicht ganz richtig.

309 Beiträge seit 2008
vor 14 Jahren

Hallo,

der Sinn der ganzen entzieht sich mir auch etwas.

Was hat du mit dem Code vor?

Und vor allem: Was soll das bringen den PHP Interpreter ohne Server im Hintergrund aufzurufen?
Das das so nicht funktioniert leuchte mir schon ein.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

M
Max Power Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

Hallo,

der Sinn ist, dass ich mir meinen eigenen kleinen HTTP Server geschrieben hab, der unter Vista (x32) auch ohne Probleme lief. Seit ich auf Win7 (x64) gewechselt hab, gibt es das Problem mit PHP (falls es überhaupt daran liegt). Das obige Progamm ist nur ein Minimalbeispiel, an dem der Fehler nachzuvollziehen ist.
Und es nervt halt ziemlich, wenn man so gar keine Ahnung hat, wo da denn jetzt was schief läuft. Die Fragen bleiben also die selben:

  1. Könnt ihr das Verhalten reproduzieren (was ja bedeuten würde, dass ich nicht ganz blöd bin - würde mir schon weiterhelfen)?
  2. Hat jemand ne Idee, wo das Problem liegt?

@Taucher: Die Ausgabe des geposteten Codes ist ok, das ist nicht das Problem. Das Problem ist, dass ich gar keine Ausgabe mehr bekomme, wenn ich eine der auskommentierten Zeilen mit ausführe, also z.B. die Umgebungsvariable SERVER_SOFTWARE setze, egal auf welchen Wert!

MfG, Max

T
307 Beiträge seit 2008
vor 14 Jahren

Hallo Max Power,
auch wenn ich den auskommentierten Code mitverwende, dann läuft das richtig bei mir.
Ich habe XP Pro und PHP 5.3.0, x86.
Ich denke nicht das es an PHP selber liegt, da Du ja eine Ausgabe bekommst.
Der Fehler muss also woanders liegen.
Hast Du den IIS laufen? Wenn ja, dann schalte den doch mal ab.

M
Max Power Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

IIS hab ich noch garnicht installiert - auch sonst keinen Server. Mein Programm hab ich ja gerade deshalb geschrieben, um nicht gleich den IIS oder Apache installieren zu müssen, nur um mal ne Homepage lokal zu testen ...

Naja, jedenfalls danke für die Info. Hoffe es findet sich noch jemand, der das mit win7 x64 ausprobieren kann.

M
Max Power Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

Servus!

Nachdem ich auf meinem Vista-Rechner dasselbe Problem hatte, habe ich mir mal den StandardError angeschaut: das Problem war die nicht gesetzte Umgebungsvariable REDIRECT_STATUS. Schätze die PHP-Version, die ich vorher benutzt habe, war ohne force-cgi-redirect kompiliert oder in der php.ini war's anders eingestellt.

Hier also der Code, mit dem nun auch mein Server wieder läuft:



        static void Main(string[] args)
        {
            string app = "D:\\Server\\PHP\\php-cgi.exe";

            Process cgi = new Process();
            cgi.OutputDataReceived += new DataReceivedEventHandler(cgi_OutputDataReceived);

            cgi.StartInfo.UseShellExecute = false;
            cgi.StartInfo.CreateNoWindow = true;
            cgi.StartInfo.RedirectStandardOutput = true;
            cgi.StartInfo.RedirectStandardInput = true;
            cgi.StartInfo.RedirectStandardError = true;
            cgi.StartInfo.FileName = app;

            cgi.StartInfo.EnvironmentVariables["SERVER_SOFTWARE"] = "ConsoleApp";
            cgi.StartInfo.EnvironmentVariables["SERVER_NAME"] = "localhost";
            cgi.StartInfo.EnvironmentVariables["SERVER_PORT"] = "80";
            cgi.StartInfo.EnvironmentVariables["SERVER_PROTOCOL"] = "HTTP/1.1";

            // Muss gesetzt werden!!!
            cgi.StartInfo.EnvironmentVariables["REDIRECT_STATUS"] = "OK";

            cgi.StartInfo.EnvironmentVariables["REQUEST_METHOD"] = "POST";
            cgi.StartInfo.EnvironmentVariables["GATEWAY_INTERFACE"] = "CGI/1.1";

            cgi.StartInfo.EnvironmentVariables["PATH_INFO"] = "E:\\test.php";
            cgi.StartInfo.EnvironmentVariables["PATH_TRANSLATED"] = "E:\\test.php";
            cgi.StartInfo.EnvironmentVariables["SCRIPT_NAME"] = "test.php";
            cgi.StartInfo.EnvironmentVariables["SCRIPT_FILENAME"] = "E:\\test.php";

            cgi.StartInfo.EnvironmentVariables["HTTP_REFERER"] = "http://www.server.com/example.html";
            cgi.StartInfo.EnvironmentVariables["HTTP_FROM"] = "example@server.com";
            cgi.StartInfo.EnvironmentVariables["HTTP_HOST"] = "www.host.com";
            cgi.StartInfo.EnvironmentVariables["HTTP_USER_AGENT"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
            cgi.StartInfo.EnvironmentVariables["HTTP_ACCEPT"] = "text/plain, text/html";

            cgi.StartInfo.EnvironmentVariables["QUERY_STRING"] = "var1=get-data&var2=test";
            cgi.StartInfo.EnvironmentVariables["REMOTE_ADDR"] = "127.0.0.1";
            cgi.StartInfo.EnvironmentVariables["REMOTE_HOST"] = "localhost";

            string post = "var1=post-data&var2=test";

            cgi.StartInfo.EnvironmentVariables["CONTENT_TYPE"] = "application/x-www-form-urlencoded";
            cgi.StartInfo.EnvironmentVariables["CONTENT_LENGTH"] = post.Length.ToString();

            cgi.Start();

            cgi.BeginOutputReadLine();

            cgi.StandardInput.WriteLine(post);
            cgi.StandardInput.Close();

            string error = cgi.StandardError.ReadToEnd();

            cgi.WaitForExit(1000);

            cgi.Close();

            Console.WriteLine(error);
        }

        static void cgi_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data);
        }

Habe jetzt die gewünschte Ausgabe


X-Powered-By: PHP/5.3.1
Content-type: text/html

GET Array
(
    [var1] => get-data
    [var2] => test
)

POST Array
(
    [var1] => post-data
    [var2] => test
)

MfG, Max

479 Beiträge seit 2008
vor 14 Jahren

Hallo,

*mist*, du warst zu schnell. Habs bei mir gerade getestet, bei mir steht mit der Variable No Input Files...

Naja, es scheint ja mit der REDIRECT_STATUS zu laufen. Server würd ich es übrigens nicht nennen 😉

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)