<?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.webserver.php',
    1 => 'Eingebauter Webserver',
    2 => 'Eingebauter Webserver',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Nutzung der Kommandzeile',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.interactive.php',
    1 => 'Interaktive Shell',
  ),
  'next' => 
  array (
    0 => 'features.commandline.ini.php',
    1 => 'INI-Einstellungen',
  ),
  '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.webserver" class="section">
  <h2 class="title">Eingebauter Webserver</h2>
  <div class="warning"><strong class="warning">Warnung</strong>
   <p class="para">
    Dieser Webserver wurde entwickelt, um bei der Anwendungsentwicklung zu
    helfen. Er kann ebenso für Testzwecke und für Anwendungsdemonstrationen
    nützlich sein, die in kontrollierten Umgebungen ausgeführt werden. Er ist
    nicht als voll funktioneller Webserver gedacht. Er sollte nicht in einem
    öffentlichen Netzwerk verwendet werden.
   </p>
  </div>
  <p class="para">
   Die <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> bietet einen eingebauten Webserver.
  </p>
  <p class="para">
   Der Webserver läuft nur mit einem single-threaded Prozess, sodass
   PHP-Anwendungen nicht weiter ausgeführt werden, wenn eine Anfrage blockiert
   wird.
  </p>
  <p class="para">
   URI-Anfragen werden vom aktuellen Arbeitsverzeichnis ausgehend
   ausgeliefert, sofern nicht die -t Option genutzt wurde um ein explizites
   Document-Root anzugeben. Wenn eine URI-Anfrage keine Datei angibt, wird
   entweder index.php oder index.html aus dem aufgerufenen Verzeichnis
   zurückgegeben. Wenn beide Dateien nicht existieren, wird die Suche von
   index.php und index.html im übergeordneten Verzeichnis fortgesetzt usw.,
   bis eine gefunden wurde, oder das Document-Root erreicht wurde. Wurde eine
   index.php oder index.html gefunden, wird sie zurückgegeben und
   $_SERVER[&#039;PATH_INFO&#039;] wird auf den abschließenden Teil des URI gesetzt.
   Andernfalls wird ein 404-Antwortcode zurückgeben.
  </p>
  <p class="para">
   Wenn auf der Kommandozeile beim Starten des Webservers eine PHP-Datei
   angegeben wird, wird diese als &quot;Router&quot;-Skript verwendet. Dieses Skript
   wird dann zu Beginn jeder HTTP-Anfrage gestartet. Wenn dieses Skript
   <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurückgibt, dann wird die angefragte Ressource direkt
   zurückgegeben. Andernfalls wird die Ausgabe des Skripts zurückgegeben.
  </p>
  <p class="para">
   Standard-MIME-Typen werden für Dateien mit den folgenden Erweiterungen
   zurückgegeben:
   <span class="simplelist"><code class="literal">.3gp</code>, <code class="literal">.apk</code>, <code class="literal">.avi</code>, <code class="literal">.bmp</code>, <code class="literal">.css</code>, <code class="literal">.csv</code>, <code class="literal">.doc</code>, <code class="literal">.docx</code>, <code class="literal">.flac</code>, <code class="literal">.gif</code>, <code class="literal">.gz</code>, <code class="literal">.gzip</code>, <code class="literal">.htm</code>, <code class="literal">.html</code>, <code class="literal">.ics</code>, <code class="literal">.jpe</code>, <code class="literal">.jpeg</code>, <code class="literal">.jpg</code>, <code class="literal">.js</code>, <code class="literal">.kml</code>, <code class="literal">.kmz</code>, <code class="literal">.m4a</code>, <code class="literal">.mov</code>, <code class="literal">.mp3</code>, <code class="literal">.mp4</code>, <code class="literal">.mpeg</code>, <code class="literal">.mpg</code>, <code class="literal">.odp</code>, <code class="literal">.ods</code>, <code class="literal">.odt</code>, <code class="literal">.oga</code>, <code class="literal">.ogg</code>, <code class="literal">.ogv</code>, <code class="literal">.pdf</code>, <code class="literal">.png</code>, <code class="literal">.pps</code>, <code class="literal">.pptx</code>, <code class="literal">.qt</code>, <code class="literal">.svg</code>, <code class="literal">.swf</code>, <code class="literal">.tar</code>, <code class="literal">.text</code>, <code class="literal">.tif</code>, <code class="literal">.txt</code>, <code class="literal">.wav</code>, <code class="literal">.webm</code>, <code class="literal">.wmv</code>, <code class="literal">.xls</code>, <code class="literal">.xlsx</code>, <code class="literal">.xml</code>, <code class="literal">.xsl</code>, <code class="literal">.xsd</code>, <code class="literal">.zip</code></span>
   .
  </p>

  <p class="simpara">
   Seit PHP 7.4.0 kann der eingebaute Webserver so konfiguriert werden, dass
   mehrere Worker geforkt werden können, um Code zu testen, der mehrere
   gleichzeitige Anfragen erfordert. Dazu muss die Umgebungsvariable
   <var class="envar">PHP_CLI_SERVER_WORKERS</var> auf die Zahl der gewünschten Worker
   gesetzt werden, bevor der Server gestartet wird.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <span class="simpara">Dieses Feature wird unter Windows nicht unterstützt.</span>
  </p></blockquote>
  <div class="warning"><strong class="warning">Warnung</strong>
   <p class="para">
    Dieses <em>experimentelle</em> Feature ist
    <em>nicht</em> für den Produktionseinsatz vorgesehen.
    Der eingebaute Webserver ist grundsätzlich <em>nicht</em>
    für den Produktionseinsatz vorgesehen.
   </p>
  </div>

  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Starten des Webservers</strong></p>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ cd ~/public_html
$ php -S localhost:8000</pre>
</div>
   </div>

   <div class="example-contents"><p>
    Die Kommandozeile wird ausgeben:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit
</pre></div>
   </div>
   <div class="example-contents"><p>
    Nach URI-Anfragen für http://localhost:8000/ und
    http://localhost:8000/myscript.html wird die Kommandozeile in etwa so
    aussehen:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit.
[Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read
[Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read
[Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read
[Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read
[Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read
</pre></div>
   </div>
   <div class="example-contents"><p>
    Es ist zu beachten, dass bis zu PHP 7.4.0 symbolisch verknüpfte statische
    Ressourcen unter Windows nicht erreichbar waren, es sei denn, das
    Router-Skript würde diese verarbeiten.
   </p></div>
  </div>
  <div class="example" id="example-2">
   <p><strong>Beispiel #2 Starten mit einer expliziten Document-Root</strong></p>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ cd ~/public_html
$ php -S localhost:8000 -t foo/</pre>
</div>
   </div>

   <div class="example-contents"><p>
    Die Kommandozeile wird ausgeben:
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011
Listening on localhost:8000
Document root is /home/me/public_html/foo
Press Ctrl-C to quit
</pre></div>
   </div>
  </div>

  <div class="example" id="example-3">
   <p><strong>Beispiel #3 Nutzung eines Router-Skripts</strong></p>
   <div class="example-contents"><p>
    In diesem Beispiel werden bei Anfragen nach Bildern diese direkt
    angezeigt; bei Anfragen nach HTML-Dateien wird stattdessen &quot;Willkommen in
    PHP!&quot; angezeigt.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// router.php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/\.(?:png|jpg|jpeg|gif)$/'</span><span style="color: #007700">, </span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"REQUEST_URI"</span><span style="color: #007700">])) {<br />    return </span><span style="color: #0000BB">false</span><span style="color: #007700">; </span><span style="color: #FF8000">// Liefere die angefragte Ressource direkt aus<br /></span><span style="color: #007700">} else {<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;Willkommen in PHP!&lt;/p&gt;"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S localhost:8000 router.php</pre>
</div>
   </div>

  </div>

  <div class="example" id="example-4">
   <p><strong>Beispiel #4 Prüfung auf die Verwendung des CLI-Webservers</strong></p>
   <div class="example-contents"><p>
    Um ein Framework-Router-Skript sowohl während der Entwicklung mit dem
    CLI-Webserver als auch später mit einem Produktions-Webserver zu
    verwenden:
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// router.php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">php_sapi_name</span><span style="color: #007700">() == </span><span style="color: #DD0000">'cli-server'</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">/* statische Assets weiterleiten und false zurückgeben */<br /></span><span style="color: #007700">}<br /></span><span style="color: #FF8000">/* weiter mit den normalen index.php-Operationen */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S localhost:8000 router.php</pre>
</div>
   </div>

  </div>

  <div class="example" id="example-5">
   <p><strong>Beispiel #5 Behandlung nicht unterstützter Dateitypen</strong></p>
   <div class="example-contents"><p>
    Wenn Sie statische Ressourcen ausliefern müssen, deren MIME-Typ vom
    CLI-Webserver nicht unterstützt wird, verwenden Sie:
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// router.php<br /></span><span style="color: #0000BB">$path </span><span style="color: #007700">= </span><span style="color: #0000BB">pathinfo</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"SCRIPT_FILENAME"</span><span style="color: #007700">]);<br />if (</span><span style="color: #0000BB">$path</span><span style="color: #007700">[</span><span style="color: #DD0000">"extension"</span><span style="color: #007700">] == </span><span style="color: #DD0000">"el"</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Content-Type: text/x-script.elisp"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">"SCRIPT_FILENAME"</span><span style="color: #007700">]);<br />}<br />else {<br />    return </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S localhost:8000 router.php</pre>
</div>
   </div>

  </div>
  <div class="example" id="example-6">
   <p><strong>Beispiel #6 Zugriff auf den CLI-Webserver von anderen Computern aus</strong></p>
   <div class="example-contents"><p>
    Sie können den Webserver wie folgt auf Port 8000 für jeden zugänglich
    machen:
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -S 0.0.0.0:8000</pre>
</div>
   </div>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="para">
     Der eingebaute Webserver sollte nicht in einem öffentlichen Netzwerk
     verwendet werden.
    </p>
   </div>
  </div>
 </div><?php manual_footer($setup); ?>