Dennis: Unterschied zwischen CGI und CLI

Beitrag lesen

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)]