Script mit PHP starten
Blinder
- php
0 Jurik0 Blinder0 Cybaer0 Blinder0 Blinder
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
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
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
Hi,
Kommandozeile läßt übrigends Hoster nicht zu.
Vielleicht hilft dir dann http://de.php.net/virtual weiter ...
Gruß, Cybaer
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 ..."
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
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¶m2=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
^
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
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¶m2=wert2 ?
Viele Grüße aus Frankfurt/Main,
Patrick
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¶m2=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
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
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
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
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
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