Unterschied zwischen CGI und CLI
Chris
- php
Hallo Forum,
kann mir eigentlich mal jemand erklären, was speziell bei PHP der Unterschied zwischen CLI und CGI ist?
Dass das eine von der Kommandozeile und das andere aus dem Webserver heraus aufgerifen wird, ist mir klar.
Was mir nicht klar ist bisher: braucht man dafür auch unterschiedliche Module bzw. Executables?
Wenn nein: kann man CGI ermöglichen und CLI unterbinden?
LG
Der Chris
kann mir eigentlich mal jemand erklären, was speziell bei PHP der Unterschied zwischen CLI und CGI ist?
Das hier könnte hilfreich sein:
http://www.php.net/manual/en/features.commandline.php
Wenn nein: kann man CGI ermöglichen und CLI unterbinden?
Ja, indem du z.B. php selbst kompilierst und dabei die Features, die du nicht haben willst, nicht mit kompilierst.
Gruß
Stareagle
Hallo Forum,
Das hier könnte hilfreich sein:
http://www.php.net/manual/en/features.commandline.php
Ok, soweit gelesen.
Wie kann ich nun feststellen, welches mir der Provider zur Verfügung stellt?
Und welches von beiden wird von den php-Befehlen exec() und shell_exec() benutzt?
LG
Der Chris
Hi Chris,
Wie kann ich nun feststellen, welches mir der Provider zur Verfügung stellt?
Wenn du PHP als Programmiersprache für deine Website einsetzt, wird es CGI sein, wenn du Kommandozeilenprogramme oder Deamons in PHP schreiben solltest, dann wirst du CLI nutzen.
Die CGI-Version von PHP gibt beispielsweise vor der Ausgabe des Scripts stets noch ein paar HTTP-Header aus, würde es das nicht tuen, wäre das außerst unpraktisch und der Apache würde dir jedes PHP-Script mit einem 500 Internal Server Error quittieren (berühmt-berüchtiges „Premature end of script headers”). Hingegen wäre es für ein Kommandozeilenprogramm ziemlich sinnlos und störend, wenn vor der Programmausgabe noch Daten ausgegeben werden, welche im Kontext der Kommandozeile keinerlei Bedeutung haben. Folglich gibt die CLI-Version von PHP keine Header aus.
Wenn du ein PHP-Binary unbekannter SAPI hast, kannst du auf der Kommandozeile dieses Binary mit „-v” angehängt aufrufen, dann bekommst du neben der Version auch die SAPI angezeigt.
Und welches von beiden wird von den php-Befehlen exec() und shell_exec() benutzt?
Gar keins. Mit exec() wie auch mit shell_exec() rufst du beliebige Programme auf dem Server auf. Du kannst natürlich auch PHP-Scripte über exec() & Co starten, aber da PHP-Scripte keine ausführbaren Binaries sind, musst du den PHP-Interpreter starten und diesem den Pfad zu deinem PHP-Script mitgeben. Und dann wird natürlich genau das PHP genommen, welches du gewählt hast.
Unter Debian kann das beispielsweise so aussehen:
driehle@s1:~$ ls -la /usr/bin | grep php
lrwxrwxrwx 1 root root 21 2006-09-15 04:58 php -> /etc/alternatives/php
-rwxr-xr-x 1 root root 5481408 2007-06-21 22:59 php5
-rwxr-xr-x 1 root root 5420120 2007-06-21 22:59 php5-cgi
lrwxrwxrwx 1 root root 25 2006-09-15 05:02 php-cgi -> /etc/alternatives/php-cgi
driehle@s1:~$ ls -la /etc/alternatives/ | grep php
lrwxrwxrwx 1 root root 13 2007-10-07 12:29 php -> /usr/bin/php5
lrwxrwxrwx 1 root root 17 2007-10-07 12:30 php-cgi -> /usr/bin/php5-cgi
Auf anderen System kann das anders aussehen. Debian hat sich entschieden, dass php5 das Binary der CLI-Version ist und php5-cgi das Binary der CGI-Version. Wie du siehst habe ich hier PHP 5 installiert, es ist also naheliegend, dass Debian die Dateien php5 und php5-cgi genannt hat.
Da aus historischen Gründen das PHP-Binary aber unter /usr/bin/php zu finden sein sollte, hat Debian mit php und php-cgi symbolische Links angelegt, welche je nachdem ob ich PHP 4 oder PHP 5 auf die php4(-cgi) oder php5(-cgi) Binaries zeigt.
Kurz um - wie nutzt du jetzt exec() für ein PHP-Script? Meist sollte so etwas klappen:
exec('/usr/bin/php /absoluter/pfad/zum/php-script.php');
Alternativ könntest du dein PHP-Script welches du über Kommandozeile starten willst mit einer Shebang-Zeile versehen, das müsste in etwa so aussehen:
~~~php
#!/usr/bin/php
<?php
// hier folgt dein normales Script
Dann dem Script mit `chmod +x` die Ausführrechte geben und schon kannst du exec() wie folgt verwenden ohne den Pfad zu PHP angeben zu müssen:
`exec('/absoluter/pfad/zum/ausfuerbahren-php-script.php');`{:.language-php}
Das UNIX System erkennt hier anhand der Shebang-Zeile in deinem Script welchen Interpreter (hier /usr/bin/php) es starten muss. Dies ist insbesondere dann von Vorteil, wenn du wirklich an der Kommandozeile arbeitest und dann nicht jedesmal wenn du das Script starten willst den Pfad zu PHP eintippen musst.
Viele Grüße,
~ Dennis.
--
Mein [SelfCode](http://community.de.selfhtml.org/fanprojekte/selfcode.htm): [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:# ss:) de:\] js:| ch:{ sh:| mo:} zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%7C+mo%3A%7D+zu%3A%7C)
[Weblog](http://riehle-web.com/blog/): [Comboboxen mit Javascript](http://riehle-web.com/blog/log.php/2007/03/comboboxen-mit-javascript) - [apr_dbd_mysql unter Debian - so geht es doch \\[Update](http://riehle-web.com/blog/log.php/2007/03/apr_dbd_mysql-unter-debian)]
Hallo Dennis,
dank Dir für die Ausführungen.
Ich habe PHP als Modul und der Interpreter (also CLI) steht auch zur Verfügung. Dann brauche ich die CGI-Variante doch bestimmt gar nicht?
Ich will nur ein paar Sachen ausprobieren, die ich die letzten Wochen im Forum so gesammelt habe.
Mailverwaltung, Jobkontrolle, usw.
LG
Der Chris
Hi Chris,
Ich habe PHP als Modul und der Interpreter (also CLI) steht auch zur Verfügung. Dann brauche ich die CGI-Variante doch bestimmt gar nicht?
Auch hier gibt es wieder Unterschiede, da du von einem Modul sprichst, meinst du wohl Apache. Hier unterscheidet man zwischen Filter und Handler, letztendlich sind das aber nur unterschiedliche Arten, wie sich PHP in den Apache einhängt und für den Gebrauch macht es eigentlich keinen Unterschied was man hat.
Die CGI-Variante benötigst du nicht, richtig. ;-) Aber wenn du schon am Ausprobieren bist, dann sei gesagt, dass du sie zumindest nutzen *kannst*. Und zwar in dem du ein ausführbares PHP-Script mit Shebang erstellst, wie im vorherigen Posting erwähnt und dieses in den cgi-bin Ordner tust (oder einen anderen Ordner mit entsprechenden Einstellungen). Dieses Script brauch dann auch nicht die Endung .php und ist von der Handhabung her mit bspw. einem Perl Script identisch.
Viele Grüße,
~ Dennis.