Blinder: Script mit PHP starten

Morgen,

ich möchte aus html eine Datei (Perl-Script) ausführen. In der url gebe ich einen Zähler mit, den ich zuvor manipuliere.
Ich habe das bisher mir js und SSI (include virtual) erledigt.
Nun hat man mich überzeugt, dass das mit php eleganter geht - was auch stimmt.
Dabei bin ich auf folgende Probleme gestossen:

1. In php-Dateien ist kein SSI möglich (Einschränkung des Hosters!?). Auch mod_Rewrite auf html hilft nicht.
Frage 1: Weiss jemand einen Workaround?

2. Falls 1 nicht funktioniert wäre es eine Möglichkeit aus php heraus das Script auszuführen.
Frage2: wie führe ich ein Perl-Script aus php heraus aus?

CU, Blinder

  1. Hey blinder,

    guckst du mal hier: exec

    Testen kannst du deinen exec-Aufruf in der Kommandozeile mit:

    'php5 foo.php?bar=foobar'

    viele Grüße,
    Jurik

    1. guckst du mal hier: exec
      Testen kannst du deinen exec-Aufruf in der Kommandozeile mit:

      Sorry, bei mir passiert da gar nichts. Weder mit exec() noch mit passthru().
      Ich dachte auch immer exec "führt ein gegebenen Befehl aus" (vgl.). Ich muss mein Perl-Programm ja eigentlich nicht ausführen, sondern dem Perl-Interpreter übergeben.

      Kommandozeile läßt übrigends Hoster nicht zu.

      CU, Blinder

      1. Hi,

        Kommandozeile läßt übrigends Hoster nicht zu.

        Vielleicht hilft dir dann http://de.php.net/virtual weiter ...

        Gruß, Cybaer

        --
        Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
        (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
        1. Vielleicht hilft dir dann http://de.php.net/virtual weiter ...

          hatte ich auch schon daran gedacht:
          Ergebnis:
          Call to undefined function: virtual()
          Antwort des Hosters:
          "Die Funktion virtual(), ist wohl eine selbstgeschriebene Funktion,
          welche uns leider nicht bekannt ist ..."

          1. Hallo zusammen,

            nach einer langen Nacht bin ich ein kleines Stück weiter:

            Ich verwende passthru(), komme damit auch auf das PERL-Script, das dann abgearbeitet wird.
            Zwei Dinge muss ich noch abstellen:
            Das Perl-Script beginnt mit
               #!/usr/bin/perl
               print "Content-type: text/html"."\n\n";
            Bei normalem Aufruf aus html macht das nix, jetzt gibt es die print-Anweisung aus.
            Weiss jemand wieso das so ist??

            Ausserdem klappt die Parameter-Übergabe nicht. Bei
               $prog="pfad/zum/prog/prog.pl var1=wert1 var2=wert2";
               passthru=($prog)
            kommen in Perl keine übergebenen Parameter an. Obwohl (sagt Hoster) bei ausführung über Command-Line es problemlos funktioniert.
            Der einzige Hinweis, den ich bisher fand bezog sich auf unterschiedliche handling von url-parametern [->param()] und kommandozeilen-parametern [@ARGV]. Hilft aber nicht viel, da ich das Perl-Script nicht ändern kann.

            Hat jemand ne Idee wie die Übergabe klappen könnte??

            Schönen Maifeiertag...

            Blinder

            1. Hallo Blinder!

              Zunächst: PHP nicht meine Heimat, und deswegen kann ich Dir zu passthru() und den abertausenden PHP-eigenen, anderen Funktionen nichts sagen.

              Zwei Dinge muss ich noch abstellen:
              Das Perl-Script beginnt mit
                 #!/usr/bin/perl
                 print "Content-type: text/html"."\n\n";

              ^
              Die Zeichenkettenverknüpfung hier ist ziemlich überflüssig:

              print "Content-type: text/html\n\n";

              Bei normalem Aufruf aus html macht das nix, jetzt gibt es die print-Anweisung aus.
              Weiss jemand wieso das so ist??

              Das deutet darauf hin, dass ein Content-Header bereits an anderer Stelle ausgegeben worden ist.

              Ausserdem klappt die Parameter-Übergabe nicht. Bei
                 $prog="pfad/zum/prog/prog.pl var1=wert1 var2=wert2";

              Wenn das eine URI werden soll, fehlen die »?« und »&«:

              $prog = "path/prog.pl?param1=wert1&param2=wert2";

              Dann kann man mit dem CGI-Modul und der von Dir bereits genannten Funtkion param() auf die Parameter zugreifen:

              my $var1 = param('param1');  # wert1  
              my $var1 = param('param2');  # wert2
              

              kommen in Perl keine übergebenen Parameter an. Obwohl (sagt Hoster) bei ausführung über Command-Line es problemlos funktioniert.

              Ja, aber hier geht es doch um CGI, oder?

              Viele Grüße aus Frankfurt/Main,
              Patrick

              --

              _ - jenseits vom delirium - _
              [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
              Nichts ist unmöglich? Doch!
              Heute schon gegökt?
              1. ^

                Die Zeichenkettenverknüpfung hier ist ziemlich überflüssig:

                Mich wunderts nur. Als SSI-include ist es auch doppelt gemoppelt. Aber da macht es offensichtlich nichts. Aus php heraus aufgerufen schon.

                Ausserdem klappt die Parameter-Übergabe nicht. Bei
                   $prog="pfad/zum/prog/prog.pl var1=wert1 var2=wert2";

                Wenn das eine URI werden soll, fehlen die »?« und »&«:

                Zwar ist php auch nicht meine Welt, aber der Aufruf ohne ? und & scheint in php richtig zu sein. Habs auch nicht geglaubt und die normale (=Deine) Variante bereits ausprobiert: Hilft auch nichts!

                Ich kann es nicht glauben. Bin ich der erste, der aus php heraus ein Perl-Script aufruft und Parameter übergeben will?

                Oder soll ich im php-Bereich posten?
                Mag eigentlich keine Doppel-Postings!

                Hoffe auf Eure Hilfe!

                Blinder

                1. Hallo Blinder!

                  Oder soll ich im php-Bereich posten?
                  Mag eigentlich keine Doppel-Postings!

                  Nicht nötig. Du bist ja schon im PHP-Bereich, ich hatte lediglich die Kategorie auf Perl gewechselt.

                  Kommt es zur gewünschten Ausgabe, wenn Du das Perl-Programm über seine URI aufrufst: http://example.org/path/prog.pl?param1=wert1&param2=wert2 ?

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
                  1. Servus Patrick,

                    Kommt es zur gewünschten Ausgabe, wenn Du das Perl-Programm über seine URI aufrufst: http://example.org/path/prog.pl?param1=wert1&param2=wert2 ?

                    Nein. Dieser Aufruf läuft ins Leere. Sobald man die Parameter mit ? anschließt wird die Datei nicht mehr gefunden. Aufruf über http://...
                    mit space und ohne ? und & dto. Return Code der Funktion ist hier 127.

                    Bei dem im vorigen Posting geschilderten Aufruf kann ich feststellen, dass die erste if-Schleife des Perl-Scripts abgearbeitet wird. Allerdings bricht das Programm ab wenn kein Parameter übergeben wird. Und genau das passiert. Return Code ist übrigends 255. Sagt Dir das was?

                    Ich habs auch schon so probiert:
                       $prog="pfad/zum/prog/prog.pl";
                       $_GET = array();
                       $_GET[var1] = datei.txt';
                       $_GET['var2'] = 'wert2';
                       passthru=($prog)

                    Gleiches Ergebinis. Erste Schleife wird abgearbeitet und plangemäßer Abbruch des Scripts aufgrund fehlender Variblen.

                    CU, Blinder

                    1. Hallo Blinder!

                      Sobald man die Parameter mit ? anschließt wird die Datei nicht mehr gefunden.

                      Das ist nicht normal. Gefunden sollte sie immer werden. Ob das Skript dann die übergebenen Parameter bearbeiten kann oder nicht, das hängt davon ab, wie das Skript aussieht. Das sagst Du uns ja nicht, und hellsehen kann keiner.

                      Sagt Dir das was?

                      Nein. Ich kenne das Skript nicht, und es ist auch nicht ersichtlich, was Du überhaupt erreichen willst. Das wird auch der Grund sein, warum so wenige antworten oder Jurik und Cybaer es aufgegeben haben...

                      Viele Grüße aus Frankfurt/Main,
                      Patrick

                      --

                      _ - jenseits vom delirium - _
                      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                      Nichts ist unmöglich? Doch!
                      Heute schon gegökt?
                      1. Dann sagt mir halt, was Ihr wissen müsst.

                        Ich versuche ein Script zu initialisieren, das eine Textdatei liest. Parameter können in einer ini-Datei festgelegt werden, die allerdings auch benötigt wird um das Script ablaufen zu lassen:

                        #!/usr/bin/perl
                        print "Content-type: text/html\n\n";

                        use CGI qw(:standard);
                         use locale;
                         print "Beginn test.pl";  // zum Test eingefügt
                         print $1;                // zum Test eingefügt

                        $config = param('config');
                         if ( $config =~ /^([.\w]+)$/ ) {
                            $config = $1;
                         print $config;
                            require "$config";
                            &logging("config file read");
                         }
                         else {
                                print "Kein Parameter übergeben!!!"; // zum Test eingefügt
                         die; }

                        Das Ergebnis soll in einer html-Datei angezeigt werden.
                        Dazu habe ich dort das php-Script eingebaut. php soll die Übergabevariablen festlegen, unter anderem auch den Namen der ini-Datei:
                        Der Einfachheit halber hier nur das wesentliche:

                        <?php
                        ...
                        $datei = "../../../cgi-bin/db/test.pl config=init.txt";
                        passthru($datei, $return_read);
                        echo $return_read;
                        ?>

                        Ausgabe:
                        Content-type: text/html
                        Das ist jetzt test.pl            // kein $1
                        Kein Parameter übergeben!!!      // else-Schleife, dann die;
                        255                              // wieder zurück in php - $return_read

                        bei
                        $datei = "../../../cgi-bin/db/test.pl?config=init.txt"; // jetzt mit ?
                        sieht die Ausgabe so aus:
                        127                       // hier wird (vermutlich) test.pl nicht gefunden

                        Stimmt auch mit den Erfahrungen bei php.net überein.

                        So, jetzt wisst Ihr so viel wie ich. Was mir beim Schreiben gerade auffiel: Kann der "." in config=init.txt ein Problem sein? Wie umgehe ich den?

                        CU, Blinder

                        1. Hallo Blinder!

                          <?php
                          ...
                          $datei = "../../../cgi-bin/db/test.pl config=init.txt";
                          passthru($datei, $return_read);
                          echo $return_read;
                          ?>

                          Ich erhalte in allen Fällen 127. Was es bedeutet, sollen die PHP-»Kollegen« beantworten, denn ich kenne die Funktionen nicht, und auch $return_read nicht. So sehen meine Dateien aus:

                          blindertest_1.php (mit »?«):

                          <?php  
                          $datei = "blindertest.pl?config=init.txt";  
                          passthru($datei, $return_read);  
                          echo $return_read;  
                          ?>
                          

                          blindertest_2.php (ohne »?«):

                          <?php  
                          $datei = "blindertest.pl config=init.txt";  
                          passthru($datei, $return_read);  
                          echo $return_read;  
                          ?>
                          

                          blindertest.pl:

                          #!/usr/bin/perl -w  
                            
                          use strict;  
                          use CGI qw(:standard);  
                          use locale;  
                            
                          print header();  
                          print "Beginn test.pl";  
                          print "<br>\n", "-" x 10, "<br>\n";  
                            
                            
                          my $config = param('config');  
                          print "Wert von Paramter 'config' ist: ", $config, "<br>\n";  
                          my $foo = param('foo');  
                          print "Wert von Paramter 'foo' ist: ", $foo, "<br>\n";  
                          

                          Der direkte Aufruf als URI http://www.atomic-eggs.com/z_testdir/blindertest.pl?config=init.txt&foo=datei.pl ergibt die gewünschte Ausgabe.

                          Wie Du also die Ausgabe des Perl-Skripts in HTML ausgeben willst, und zwar von PHP aus, kann ich Dir mangels PHP-Kenntnisse nicht sagen. Bewiesen ist aber, dass die Paramterübergabe funktioniert. Wenn es bei Dir nicht klappt, dann gilt Struppis Spruch ;)

                          Viele Grüße aus Frankfurt/Main,
                          Patrick

                          --

                          _ - jenseits vom delirium - _
                          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                          Nichts ist unmöglich? Doch!
                          Heute schon gegökt?
                          1. Vielen Dank, Patrick, aus München!

                            ist wirklich mysteriös.
                            Dann muss es an der Übergabe von php an Perl zu liegen.

                            Bleibt ja noch die Hoffnung, dass ein php-Spezi das Mirakel auflösen kann.

                            Nochmals vielen Dank!

                            CU, Blinder

                            1. Für alle, die es interessiert:

                              Hier ist die Lösung, die ich von anderer Seite erhalten habe:

                              Der Zugriff auf die Variablen erhält man über die Globale Variable $ARGV[] (Consolen-Aufruf).
                              Den Inhalt der ersten Variable möchten erhält man z.B. mit $ARGV[0] zugreifen.

                              Statt passthrufunktioniert bei mir auch shell_exec. Wichtig ist ist
                              aber, das die Variablen nicht per &, sondern per Leerzeichen von
                              einander getrennt sind.

                              CU, Blinder