<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.exec.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'function.proc-open.php',
    1 => 'proc_open',
    2 => 'F&uuml;hrt ein Kommando aus und &ouml;ffnet Dateizeiger f&uuml;r die Ein- und Ausgabe',
  ),
  'up' => 
  array (
    0 => 'ref.exec.php',
    1 => 'Funktionen zur Programmausf&uuml;hrung',
  ),
  'prev' => 
  array (
    0 => 'function.proc-nice.php',
    1 => 'proc_nice',
  ),
  'next' => 
  array (
    0 => 'function.proc-terminate.php',
    1 => 'proc_terminate',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/exec/functions/proc-open.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.proc-open" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">proc_open</h1>
  <p class="verinfo">(PHP 4 &gt;= 4.3.0, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">proc_open</span> &mdash; <span class="dc-title">
   Führt ein Kommando aus und öffnet Dateizeiger für die Ein- und Ausgabe
  </span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.proc-open-description">
  <h3 class="title">Beschreibung</h3>
   <div class="methodsynopsis dc-description">
    <span class="methodname"><strong>proc_open</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.array.php" class="type array">array</a></span>|<span class="type"><a href="language.types.string.php" class="type string">string</a></span></span> <code class="parameter">$command</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter">$descriptor_spec</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter reference">&$pipes</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.string.php" class="type string">string</a></span></span> <code class="parameter">$cwd</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter">$env_vars</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.array.php" class="type array">array</a></span></span> <code class="parameter">$options</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span><br>): <span class="type"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>proc_open()</strong></span> ist äquivalent zu <span class="function"><a href="function.popen.php" class="function">popen()</a></span>,
   ermöglicht aber einen höheren Grad von Kontrolle über die Programmausführung.
  </p>



 </div>


 <div class="refsect1 parameters" id="refsect1-function.proc-open-parameters">
  <h3 class="title">Parameter-Liste</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">command</code></dt>
     <dd>
      <p class="para">
       Das auszuführende Kommandozeile als <a href="language.types.string.php" class="link">String</a>. Sonderzeichen müssen
       ordnungsgemäß maskiert und Argumente ggf. in Anführungszeichen
       eingeschlossen werden.
      </p>
      <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
       <span class="simpara">
        Unter <em>Windows</em> wird, falls
        <code class="literal">bypass_shell</code> in
        <code class="parameter">options</code> nicht auf <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> gesetzt ist, das
        <code class="parameter">command</code> mit dem Flag <code class="literal">/c</code> als
        <em>nicht in Anführungszeichen eingeschlossene</em>
        Zeichenkette (d. h. genau wie an <span class="function"><strong>proc_open()</strong></span>
        übergeben) an <strong class="command">cmd.exe</strong> übergeben (genauer gesagt an
        <code class="literal">%ComSpec%</code>). Dies kann dazu führen, dass
        <strong class="command">cmd.exe</strong> die umschließenden Anführungszeichen von
        <code class="parameter">command</code> entfernt (Details sind der Dokumentation
        von <strong class="command">cmd.exe</strong> zu entnehmen), was zu unerwartetem und
        potentiell sogar gefährlichem Verhalten führen kann, da
        Fehlermeldungen von <strong class="command">cmd.exe</strong> das übergebene
        <code class="parameter">command</code> oder Teile davon enthalten können (siehe
        Beispiel weiter unten).
       </span>
      </p></blockquote>
      <p class="para">
       Von PHP 7.4.0 an kann <code class="parameter">command</code> als <a href="language.types.array.php" class="link">Array</a> von
       Befehlsparametern übergeben werden. In diesem Fall wird der Prozess
       direkt gestartet (ohne Umweg über die Shell) und PHP kümmert sich um
       das nötige Maskieren der Argumente.
      </p>
      <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
       <p class="para">
        Unter Windows erfolgt die Argumentenmaskierung der <a href="language.types.array.php" class="link">Array</a>-Elemente
        unter der Annahme, dass das Parsen der Kommandozeile des
        auszuführenden Kommandos kompatibel ist mit dem Parsen der
        Kommandozeile durch die VC-Laufzeitumgebung.
       </p>
      </p></blockquote>
     </dd>
    
    
     <dt><code class="parameter">descriptor_spec</code></dt>
     <dd>
      <p class="para">
       Ein indexiertes Array, in dem die Schlüssel die Descriptornummer
       repräsentieren und die Werte die Art und Weise, in der PHP die
       Descriptoren an die Child-Prozesse übergibt. 0 steht dabei für stdin, 1
       für stdout und 2 für stderr.
      </p>
      <p class="para">
       Jedes Element kann sein:
       <ul class="simplelist">
        <li>
         Ein Array, das die Pipe beschreibt, die an den Prozess übergeben
         wird. Das erste Element ist der Descriptortyp, das zweite Element ist
         eine Option für den angegebenen Typ. Gültige Typen sind
         <code class="literal">pipe</code> (das zweite Element ist entweder
         <code class="literal">r</code>, um das Ende des Leseprozesses der Pipe an den
         Prozess zu übergeben, oder <code class="literal">w</code>, um das Ende des
         Schreibprozesses zu übergeben) und <code class="literal">file</code> (das
         zweite Element ist ein Dateiname). Es ist zu beachten, dass alles
         außer w wie r behandelt wird.
        </li>
        <li>
         Eine Streamressource, die einen echten Filedescriptor repräsentiert
         (z. B. geöffnete Dateien, Sockets, <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>).
        </li>
       </ul>
      </p>
      <p class="para">
       Die Filedescriptor-Nummern sind nicht limitiert auf 0, 1 und 2 - Sie
       können jede gültige Filedescriptor-Nummer angeben, die an den
       Kindprozess übergeben wird. Dies erlaubt es Ihrem Skript, mit anderen
       Skripten zu interagieren, die als &quot;Co-Prozesse&quot; laufen. Dies ist
       insbesondere dann nützlich, wenn Passwörter auf sichere Weise an
       Programme wie PGP, GPG und openssl übergeben werden sollen. Es ist
       ebenfalls nützlich, um Lesestatus-Informationen zu erhalten, die von
       diesen Programmen für zusätzliche Filedescriptoren ermittelt werden.
      </p>
     </dd>
    
    
     <dt><code class="parameter">pipes</code></dt>
     <dd>
      <p class="para">
       Enthält ein numerisches Array von Dateizeigern, die der PHP-Seite jeder
       erstellten Pipe entsprechen.
      </p>
     </dd>
    
    
     <dt><code class="parameter">cwd</code></dt>
     <dd>
      <p class="para">
       Das initiale Arbeitsverzeichnis des Kommandos. Dies muss ein
       <strong>absoluter</strong> Pfadname sein. Wenn Sie
       den Standardwert verwenden möchten (dies wäre das Arbeitsverzeichnis
       des aktuellen PHP-Prozesses), muss der Wert <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> sein.
      </p>
     </dd>
    
    
     <dt><code class="parameter">env_vars</code></dt>
     <dd>
      <p class="para">
       Ein Array mit den Umgebungsvariablen für das auszuführende Kommando,
       oder <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, wenn Sie die gleiche Umgebung wie der aktuelle PHP-Prozess
       nutzen wollen.
      </p>
     </dd>
    
    
     <dt><code class="parameter">options</code></dt>
     <dd>
      <p class="para">
       Erlaubt Ihnen, zusätzliche Optionen anzugeben. Derzeit unterstützte
       Optionen sind:
       <ul class="simplelist">
        <li>
         <code class="literal">suppress_errors</code> (nur unter Windows): Unterdrückt
         Fehlermeldungen, die durch diese Funktion hervorgerufen werden, sofern
         der Wert auf <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> gesetzt wurde.
        </li>
        <li>
         <code class="literal">bypass_shell</code> (nur unter Windows): umgeht die
         <code class="literal">cmd.exe</code>-Shell, wenn der Wert auf <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> gesetzt
         wurde.
        </li>
        <li>
         <code class="literal">blocking_pipes</code> (nur unter Windows): erzwingt
         blockierende Pipes, wenn der Wert auf <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> gesetzt wurde.
        </li>
        <li>
         <code class="literal">create_process_group</code> (nur unter Windows):
         ermöglicht dem Kindprozess <code class="literal">CTRL</code> Ereignisse zu
         behandeln, wenn der Wert auf <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> gesetzt wurde.
        </li>
        <li>
         <code class="literal">create_new_console</code> (nur unter Windows): der neue
         Prozess hat eine neue Konsole anstatt die Konsole des Elternprozesses
         zu erben
        </li>
       </ul>
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.proc-open-returnvalues">
  <h3 class="title">Rückgabewerte</h3>
  <p class="para">
   Gibt eine Ressource zurück, die den Prozess repräsentiert, der unter
   Verwendung von <span class="function"><a href="function.proc-close.php" class="function">proc_close()</a></span> freigegeben werden soll, wenn
   Sie ihn beenden. Im Fehlerfall wird <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurückgegeben.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-function.proc-open-errors">
  <h3 class="title">Fehler/Exceptions</h3>
  <p class="simpara">
   Wenn <code class="parameter">command</code> ein Array ist, das nicht mindestens ein
   nicht-leeres Element enthält, wird seit PHP 8.3.0 ein
   <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> ausgelöst.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.proc-open-changelog">
  <h3 class="title">Changelog</h3>
  <p class="para">
   <table class="doctable informaltable">
    
     <thead>
      <tr>
       <th>Version</th>
       <th>Beschreibung</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>8.3.0</td>
       <td>
        Ein <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> wird ausgelöst, wenn
        <code class="parameter">command</code> ein Array ist, das nicht mindestens ein
        nicht-leeres Element hat.
       </td>
      </tr>

      <tr>
       <td>7.4.4</td>
       <td>
        Die Option <code class="literal">create_new_console</code> wurde dem Parameter
        <code class="parameter">options</code> hinzugefügt.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        <span class="function"><strong>proc_open()</strong></span> akzeptiert nun ebenfalls ein <a href="language.types.array.php" class="link">Array</a>
        für das <code class="parameter">command</code>.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        Die Option <code class="literal">create_process_group</code> wurde dem Parameter
        <code class="parameter">options</code> hinzugefügt.
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.proc-open-examples">
  <h3 class="title">Beispiele</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Ein <span class="function"><strong>proc_open()</strong></span>-Beispiel</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$descriptorspec </span><span style="color: #007700">= array(<br />   </span><span style="color: #0000BB">0 </span><span style="color: #007700">=&gt; array(</span><span style="color: #DD0000">"pipe"</span><span style="color: #007700">, </span><span style="color: #DD0000">"r"</span><span style="color: #007700">),  </span><span style="color: #FF8000">// stdin ist eine Pipe, von der das Child liest<br />   </span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; array(</span><span style="color: #DD0000">"pipe"</span><span style="color: #007700">, </span><span style="color: #DD0000">"w"</span><span style="color: #007700">),  </span><span style="color: #FF8000">// stdout ist eine Pipe, in die das Child schreibt<br />   </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; array(</span><span style="color: #DD0000">"file"</span><span style="color: #007700">, </span><span style="color: #DD0000">"/tmp/error-output.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"a"</span><span style="color: #007700">) </span><span style="color: #FF8000">// stderr ist eine Datei,<br />                                                    // in die geschrieben wird<br /></span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$cwd </span><span style="color: #007700">= </span><span style="color: #DD0000">'/tmp'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$env </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'some_option' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'aeiou'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$process </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #DD0000">'php'</span><span style="color: #007700">, </span><span style="color: #0000BB">$descriptorspec</span><span style="color: #007700">, </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">, </span><span style="color: #0000BB">$cwd</span><span style="color: #007700">, </span><span style="color: #0000BB">$env</span><span style="color: #007700">);<br /><br />if (</span><span style="color: #0000BB">is_resource</span><span style="color: #007700">(</span><span style="color: #0000BB">$process</span><span style="color: #007700">)) {<br />    </span><span style="color: #FF8000">// $pipes sieht nun so aus:<br />    // 0 =&gt; Schreibhandle, das auf das Child stdin verbunden ist<br />    // 1 =&gt; Lesehandle, das auf das Child stdout verbunden ist<br />    // Jedwede Fehlerausgabe wird an /tmp/error-output.txt angefügt<br /><br />    </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">], </span><span style="color: #DD0000">'&lt;?php print_r($_ENV); ?&gt;'</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]);<br /><br />    echo </span><span style="color: #0000BB">stream_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]);<br />    </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]);<br /><br />    </span><span style="color: #FF8000">// Es ist wichtig, dass Sie alle Pipes schließen, bevor Sie<br />    // proc_close aufrufen, um Deadlocks zu vermeiden<br />    </span><span style="color: #0000BB">$return_value </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$process</span><span style="color: #007700">);<br /><br />    echo </span><span style="color: #DD0000">"Rückgabewert des Kommandos: </span><span style="color: #0000BB">$return_value</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt
eine ähnliche Ausgabe wie:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Array
(
    [some_option] =&gt; aeiou
    [PWD] =&gt; /tmp
    [SHLVL] =&gt; 1
    [_] =&gt; /usr/local/bin/php
)
Rückgabewert des Kommandos: 0</pre>
</div>
    </div>
   </div>
  </p>

  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 <span class="function"><strong>proc_open()</strong></span>-Eigenheit unter Windows</strong></p>
    <div class="example-contents"><p>
     Während man erwarten könnte, dass das folgende Program die Datei
     <var class="filename">filename.txt</var> nach dem Text <code class="literal">suche</code>
     durchsucht und die Ergebnisse ausgibt, verhält es sich ganz anders.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$descriptorspec </span><span style="color: #007700">= [</span><span style="color: #0000BB">STDIN</span><span style="color: #007700">, </span><span style="color: #0000BB">STDOUT</span><span style="color: #007700">, </span><span style="color: #0000BB">STDOUT</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$cmd </span><span style="color: #007700">= </span><span style="color: #DD0000">'"findstr" "suche" "filename.txt"'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$proc </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$cmd</span><span style="color: #007700">, </span><span style="color: #0000BB">$descriptorspec</span><span style="color: #007700">, </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">proc_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$proc</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">Der Befehl &quot;findstr&quot; &quot;suche&quot; &quot;filename.txt&quot; ist entweder falsch geschrieben oder
konnte nicht gefunden werden.</pre>
</div>
    </div>
    <div class="example-contents"><p>
     Um dieses Verhalten zu vermeiden, ist es üblicherweise ausreichend das
     <code class="parameter">command</code> in zusätzliche Anführungszeichen einzuschließen:
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">$cmd = '""findstr" "suche" "filename.txt""';</span></code></div>
    </div>

   </div>
  </p>



 </div>


 <div class="refsect1 notes" id="refsect1-function.proc-open-notes">
  <h3 class="title">Anmerkungen</h3>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Windows-Kompatibilität: Descriptoren höher 2 (stderr) sind Childprozessen
    als vererbbare Handles verfügbar, aber da die Windows-Architektur die
    Nummern der Filedescriptoren nicht mit Low-Level-Handles verbindet, hat
    der Kindprozess (bis jetzt) keine Möglichkeit, diese Handles anzusprechen.
    Stdin, stdout und stderr funktionieren wie erwartet.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <p class="para">
    Wenn Sie nur eine unidirektionale (Einweg-) Prozesspipe benötigen, nutzen
    Sie besser <span class="function"><a href="function.popen.php" class="function">popen()</a></span>, da diese Funktion leichter zu
    verwenden ist.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.proc-open-seealso">
  <h3 class="title">Siehe auch</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.popen.php" class="function" rel="rdfs-seeAlso">popen()</a> - &Ouml;ffnet einen Dateizeiger f&uuml;r einen Prozess</span></li>
    <li><span class="function"><a href="function.exec.php" class="function" rel="rdfs-seeAlso">exec()</a> - F&uuml;hrt ein externes Programm aus</span></li>
    <li><span class="function"><a href="function.system.php" class="function" rel="rdfs-seeAlso">system()</a> - F&uuml;hrt ein externes Programm aus und zeigt dessen Ausgabe an</span></li>
    <li><span class="function"><a href="function.passthru.php" class="function" rel="rdfs-seeAlso">passthru()</a> - F&uuml;hrt ein externes Programm aus und zeigt dessen Ausgabe an</span></li>
    <li><span class="function"><a href="function.stream-select.php" class="function" rel="rdfs-seeAlso">stream_select()</a> - Runs the equivalent of the select() system call on the given
   arrays of streams with a timeout specified by seconds and microseconds</span></li>
    <li>Der <a href="language.operators.execution.php" class="link">Backtick-Operator</a></li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>