<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.commandline.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'features.commandline.usage.php',
    1 => 'Verwendung',
    2 => 'Ausf&uuml;hren von PHP-Dateien',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Nutzung der Kommandzeile',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.options.php',
    1 => 'Optionen',
  ),
  'next' => 
  array (
    0 => 'features.commandline.io-streams.php',
    1 => 'I/O Streams',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'features/commandline.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.commandline.usage" class="section">
  <h2 class="title">Ausführen von PHP-Dateien</h2>
  
  <p class="para">
   Es gibt drei verschiedene Wege, PHP-Code in der <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> auszuführen:
   <ol type="1">
    <li class="listitem">
     <p class="para">
      PHP mitteilen, eine bestimmte Datei auszuführen.
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ php my_script.php

$ php -f my_script.php
</pre></div>
      </div>
     </div>
     <p class="para">
      Beide Methoden (ob die Option <strong class="option unknown">-f</strong> verwendet wird oder
      nicht) führen die Datei <var class="filename">my_script.php</var> aus. Zu
      beachten ist, dass es keine Einschränkungen dafür gibt, welche Dateien
      ausgeführt werden können; beispielsweise muss das PHP-Skript nicht auf
      <code class="literal">.php</code> enden.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Den auszuführenden PHP-Code direkt auf der Kommandozeile angeben.
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ php -r &#039;print_r(get_defined_constants());&#039;
</pre></div>
      </div>
     </div>
     <p class="para">
      Es muss besonders Acht gegeben werden auf die Ersetzung von
      Kommandozeilenvariablen und Benutzung von Anführungszeichen.
     </p>
     <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
      <p class="para">
       Achten Sie darauf, dass sie keine PHP-Tags übergeben. Die Option
       <strong class="option unknown">-r</strong> benötigt diese nicht und löst einen Parser-Fehler
       aus, falls sie dennoch verwendet werden.
      </p>
     </p></blockquote>
    </li>
    <li class="listitem">
     <p class="para">
      Eingabe des PHP-Codes über die Standardeingabe
      (<code class="literal">stdin</code>).
     </p>
     <p class="para">
      Dies eröffnet die Möglichkeit, PHP-Code dynamisch zu generieren und
      anschließend an das PHP-Binary zu übergeben, wie in diesem
      (ausgedachten) Beispiel dargestellt:
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ some_application | some_filter | php | sort -u &gt; final_output.txt
</pre></div>
      </div>
     </div>
    </li>
   </ol>
   Die drei Möglichkeiten zur Codeausführung können nicht kombiniert werden.
  </p>
  <p class="para">
   Wie jede Kommandozeilenanwendung nimmt das PHP-Binary etliche Argumente
   entgegen, aber auch das PHP-Skript kann Argumente entgegennehmen. Die
   Anzahl der Argumente, die an ein Skript übergeben werden können, ist nicht
   von PHP beschränkt (und obwohl die Kommandozeilenumgebung ein Limit für die
   Anzahl der Zeichen hat, die übergeben werden können, wird dieses im
   Allgemeinen nicht erreicht werden). Die Argumente, die dem Skript übergeben
   werden, sind in dem globalen Array <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var> gespeichert.
   Der erste Index (Null) enthält immer den Skriptnamen. Wenn der Code mittels
   der Option <strong class="option unknown">-r</strong> ausgeführt wurde, ist der Wert von
   <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var> <code class="literal">&quot;Standard input code&quot;</code>; vor
   PHP 7.2.0 war es ein Bindestrich (<code class="literal">-</code>). Selbiges gilt für
   Code, welcher über <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong> ausgeführt wird.
  </p>
  <p class="para">
   Die zweite registrierte globale Variable ist <var class="varname"><a href="reserved.variables.argc.php" class="classname">$argc</a></var>,
   welche die Anzahl der Elemente im Array <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var> enthält,
   (<strong>nicht</strong> die Anzahl Argumente, die dem
   Skript übergeben wurden).
  </p>
  <p class="para">
   Solange die Argumente, welche dem Skript übergeben werden, nicht mit dem
   Zeichen <code class="literal">-</code> beginnen, gibt es nichts besonderes zu
   beachten. Ein Argument zu übergeben, welches mit <code class="literal">-</code>
   beginnt, wird jedoch Probleme bereiten, da PHP denkt, dass es das Argument
   selbst verarbeiten muss, noch bevor das Skript ausgeführt wird. Nutzen Sie
   das Argument-Trennzeichen <code class="literal">--</code>, um dies zu vermeiden.
   Nachdem dieses Trennzeichen von PHP geparst wurde, wird jedes folgende
   Argument unangetastet an das Skript weitergereicht.
  </p>
  <div class="informalexample">
   <div class="example-contents screen">
<div class="cdata"><pre>
# Dies führt nicht den angegebenen Code aus, sondern zeigt die Optionen von PHP an
$ php -r &#039;var_dump($argv);&#039; -h
Usage: php [options] [-f] &lt;file&gt; [args...]
[...]

# Dies übergibt das Argument &#039;-h&#039; an Ihr Skript und zeigt die Optionen von PHP nicht an
$ php -r &#039;var_dump($argv);&#039; -- -h
array(2) {
  [0]=&gt;
  string(1) &quot;-&quot;
  [1]=&gt;
  string(2) &quot;-h&quot;
}
</pre></div>
   </div>
  </div>
  <p class="para">
   Es gibt auf Unix-Systemen jedoch einen weiteren Weg, um PHP für
   Kommandozeilenskripte zu verwenden. Sie können ein Skript erstellen, in dem
   die erste Zeile mit <code class="literal">#!/usr/bin/php</code> beginnt (oder wie
   auch immer der Pfad zu Ihrer PHP-<abbr title="Command Line Interpreter/Interface">CLI</abbr>-Binärdatei ist). Nachfolgend können
   Sie normalen PHP-Code innerhalb der PHP-Start- und -End-Tags verwenden.
   Sobald Sie die Datei ausführbar gemacht haben (beispielsweise mittels
   <strong class="command">chmod +x test</strong>), kann Ihr Skript wie ein normales
   Kommandozeilen- oder Perl-Skript gestartet werden.
  </p>
  <div class="example" id="example-1">
   <p><strong>Beispiel #1 PHP als Shellskript ausführen</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">#!/usr/bin/php<br /><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$argv</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>
    Angenommen, die Datei heißt <var class="filename">test</var> und befindet sich im
    aktuellen Verzeichnis, dann können wir nun folgendes tun:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
$ chmod +x test
$ ./test -h -- foo
array(4) {
  [0]=&gt;
  string(6) &quot;./test&quot;
  [1]=&gt;
  string(2) &quot;-h&quot;
  [2]=&gt;
  string(2) &quot;--&quot;
  [3]=&gt;
  string(3) &quot;foo&quot;
}
</pre></div>
   </div>
  </div>
  <p class="para">
   Wie zu sehen ist, muss in diesem Fall keine besondere Rücksicht auf die
   Übergabe von Parametern genommen werden, die mit <code class="literal">-</code>
   beginnen.
  </p>
  <p class="para">
   Die ausführbare PHP-Datei kann verwendet werden, um PHP-Skripte vollkommen
   unabhängig von einem Webserver auszuführen. Auf Unix-Systemen sollte die
   spezielle erste Zeile <code class="literal">#!</code> (&quot;Shebang&quot;) zu PHP-Skripten
   hinzugefügt werden, damit das System automatisch herausfinden kann, welches
   Programm zur Ausführung der Datei genutzt werden soll. Auf Windows-Systemen
   ist es möglich, <var class="filename">php.exe</var> mit der Doppelklick-Option der
   Erweiterung <code class="literal">.php</code> zu verknüpfen. Es kann auch eine
   Batchdatei erstellt werden, um das Skript von PHP ausführen zu lassen. Die
   erste Zeile, die dem Skript hinzugefügt wird, damit es unter UNIX läuft,
   stört unter Windows nicht, so dass auf diese Weise problemlos
   plattformübergreifende Programme geschrieben werden können. Im Folgenden
   wird anhand eines einfachen Beispiels gezeigt, wie ein
   PHP-Kommandozeilenprogramm geschrieben wird.
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 Ein Skript, das von der Kommandozeile aus ausgeführt werden soll (script.php)</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">#!/usr/bin/php<br /><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">!= </span><span style="color: #0000BB">2 </span><span style="color: #007700">|| </span><span style="color: #0000BB">in_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">], array(</span><span style="color: #DD0000">'--help'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-help'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-h'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-?'</span><span style="color: #007700">))) {<br /></span><span style="color: #0000BB">?&gt;<br /></span><br />Das ist ein Kommandozeilenprogramm in PHP mit einer Option.<br /><br />  Verwendung:<br />  <span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]; </span><span style="color: #0000BB">?&gt;</span> &lt;option&gt;<br /><br />  &lt;option&gt; kann ein Wort sein, das Sie gerne<br />  ausgeben möchten. Mit den Optionen --help,<br />  -help, -h oder -? bekommen Sie diese Hilfe.<br /><br /><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">} else {<br />    echo </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   In dem oben beschriebenen Skript haben wir die erste Zeile dazu verwendet,
   anzugeben, dass die Datei von PHP ausgeführt werden soll. Wir arbeiten hier
   mit einer <abbr title="Command Line Interpreter/Interface">CLI</abbr>-Version, deswegen werden keine
   <abbr title="Hypertext Transfer Protocol">HTTP</abbr>-Header ausgegeben.
  </p>
  <p class="para">
   In dem obigen Programm wird zuerst überprüft, ob das notwendige Argument
   angeben ist (zusätzlich zum Skriptnamen, welcher auch gezählt wird). Wenn
   nicht, oder wenn das Argument <strong class="option unknown">--help</strong>,
   <strong class="option unknown">-help</strong>, <strong class="option unknown">-h</strong> oder <strong class="option unknown">-?</strong> war,
   wird eine Hilfe-Nachricht ausgegeben, welche <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var>
   nutzt, um den auf der Kommandozeile eingegebenen Skript-Namen auszugeben.
   Andernfalls wird das Argument genauso ausgegeben, wie es übergeben wurde.
  </p>
  <p class="para">
   Um das obige Skript unter UNIX auszuführen, muss es zuerst ausführbar
   gemacht werden, und danach einfach als <strong class="command">script.php
   GebeDasHierAus</strong> oder <strong class="command">script.php -h</strong> aufgerufen
   werden. Unter Windows kann zu diesem Zweck eine Batchdatei erstellt werden:
  </p>

  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 Batchdatei zur Ausführung eines Kommandozeilen-Skripts in PHP (script.bat)</strong></p>
    <div class="example-contents">
<div class="winbatcode"><pre class="winbatcode">@echo OFF
&quot;C:\php\php.exe&quot; script.php %*</pre>
</div>
    </div>

   </div>
  </p>
  <p class="para">
   Angenommen, das obige Programm wurde <var class="filename">script.php</var> genannt
   und die <abbr title="Command Line Interpreter/Interface">CLI</abbr> <var class="filename">php.exe</var> hat den Pfad
   <var class="filename">C:\php\php.exe</var>, so wird diese Batchdatei es mit allen
   übergebenen Argumenten aufrufen: <strong class="command">script.bat
   GebeDasHierAus</strong> oder <strong class="command">script.bat -h</strong>.
  </p>
  <p class="para">
   Siehe auch die <a href="ref.readline.php" class="link">Readline</a>-Erweiterung für
   weitere Funktionen, um PHP-Kommandozeilenanwendungen zu verbessern.
  </p>
  <p class="para">
   Unter Windows kann PHP so konfiguiert werden, dass es auch ausgeführt wird,
   wenn weder <var class="filename">C:\php\php.exe</var> angegeben wird, noch die
   Dateierweiterung <code class="literal">.php</code> genutzt wird. Siehe dazu die
   Dokumentation zur
   <a href="install.windows.commandline.php" class="link">PHP-Kommandozeile unter Microsoft Windows</a>.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Unter Windows wird empfohlen, PHP unter einem echten User-Account
    auszuführen. Wird es unter einem Netzwerk-Account ausgeführt, werden
    bestimmte Operationen fehlschlagen, weil &quot;keine Zuordnung zwischen
    Kontennamen und Sicherheits-IDs erfolgte&quot;.
   </p>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>