<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'features.commandline.usage.php',
    1 => 'Usage',
    2 => 'Executing PHP files',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Command line usage',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.options.php',
    1 => 'Opzioni',
  ),
  'next' => 
  array (
    0 => 'features.commandline.io-streams.php',
    1 => 'Flussi I/O',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    '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">Executing PHP files</h2>
  
  
  <p class="para">
   Ci sono tre differenti modi per fornire alla <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> il codice PHP
   da eseguire:
   <ol type="1">
    <li class="listitem">
     <p class="para">
      Dire al PHP di eseguire un file.
     </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">
      Entrambi i metodi (con o senza l&#039;opzione <strong class="option unknown">-f</strong>) eseguono il
      file <var class="filename">my_script.php</var>. Si può scegliere qualsiasi nome per lo
      script da eseguire - non è obbligatorio che gli script PHP finiscano
      con l&#039;estensione <code class="literal">.php</code>.
     </p>
     <blockquote class="note"><p><strong class="note">Nota</strong>: 
      <p class="para">
       Se si ha la necessità di passare degli argomenti allo script quando si usa l&#039;opzione
       <strong class="option unknown">-f</strong>, il primo argomento deve essere <code class="literal">--</code>.
      </p>
     </p></blockquote>
    </li>
    <li class="listitem">
     <p class="para">
      Passare il codice PHP da eseguire direttamente da linea di comando.
     </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">
      Occorre prestare molta attenzione alla sostituzione delle variabili di shell
      e all&#039;uso degli apici.
     </p>
     <blockquote class="note"><p><strong class="note">Nota</strong>: 
      <p class="para">
       Osservando con attenzione l&#039;esempio si nota l&#039;assenza dei tag di inizio e fine!
       L&#039;opzione <strong class="option unknown">-r</strong> non li richiede. L&#039;uso dei tag genera un
       errore di parsing.
      </p>
     </p></blockquote>
    </li>
    <li class="listitem">
     <p class="para">
      Si può passare il codice PHP da eseguire via standard input
      (<code class="literal">stdin</code>).
     </p>
     <p class="para">
      Questo da la possibilità di generare dinamicamente del codice
      PHP e passarlo all&#039;eseguibile, come illustrato nel seguente esempio (fittizio):
     </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>
   Non si possono combinare tra loro questi tre metodi di esecuzione del codice.
  </p>
  
  <p class="para">
   Come qualsiasi applicazione di shell, anche l&#039;eseguibile PHP accetta diversi
   argomenti, ma anche lo script PHP può ricevere argomenti. Il
   numero degli argomenti che possono essere passati allo script non è limitato dal PHP
   (e anche se la shell ha un limite nel numero di caratteri che possono essere
   passati, solitamente non si raggiunge questo limite). Gli argomenti passati allo
   script sono disponibili nell&#039;array globale <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var>. L&#039;indice
   zero contiene sempre il nome dello script come è stato chiamato dalla
   linea di comando. Si noti che se il codice è eseguito in-line usando l&#039;opzione
   <strong class="option unknown">-r</strong> il valore dei <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var>
   sarà un trattino (<code class="literal">-</code>). Lo stesso avviene se il codice è
   eseguito attraverso un pipe dallo <code class="literal">STDIN</code>.
  </p>

  <p class="para">
   Una seconda variabile globale, <var class="varname"><a href="reserved.variables.argc.php" class="classname">$argc</a></var>,
   contiene il numero degli elementi nella matrice <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var>
   (<strong>non</strong> è il numero degli argomenti passati allo
   script).
  </p>
  
  <p class="para">
   Fino a quando gli argomenti passati allo script non iniziano con 
   il carattere <code class="literal">-</code> non si deve prestare alcuna cautela.
   Tuttavia se si passa allo script argomenti che iniziano con <code class="literal">-</code>
   si hanno dei problemi perché lo stesso PHP ritiene di doverli gestire,
   anche prima di eseguire lo script. Per evitare ciò occorre utilizzare il separatore di argomenti
   <code class="literal">--</code>. Dopo che il PHP ha incontrato questo separatore,
   ogni argomento verrà passato direttamente allo script.
  </p>
  
  <div class="informalexample">
   <div class="example-contents screen">
<div class="cdata"><pre>
# Questo non visualizzerà il codice passato, ma l&#039;elenco delle opzioni
$ php -r &#039;var_dump($argv);&#039; -h
Usage: php [options] [-f] &lt;file&gt; [args...]
[...]

# Questo passerà il &#039;-h&#039;allo script ed eviterà al PHP di visualizzare le opzioni
$ 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">
   Tuttavia esiste un&#039;altro modo per eseguire gli script PHP.
   Si può scrivere uno script la cui prima riga inizi con
   <code class="literal">#!/usr/bin/php</code>. Seguendo questa regola si può posizionare
   il normale codice PHP tra i tag di apertura e chiusura
   del PHP. Una volta impostati correttamente gli attributi
   del file (ad esempio <strong class="command">chmod +x test</strong>) lo script può essere eseguito
   come una normale shell o script perl:
  </p>
  
  <div class="example" id="example-1">
   <p><strong>Example #1 Eseguire uno script PHP come shell script</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>
   Supponendo che questo file sia chiamato <var class="filename">test</var> nella directory
   corrente, si può eseguire:
   </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">
   Come si può notare in questo caso non vi è necessità di prestare attenzione nel passare 
   i parametri che iniziano con  <code class="literal">-</code>.
  </p>
  
  <p class="para">
   L&#039;eseguibile PHP può essere utilizzato per eseguire script PHP in modo indipendente
   dal server web. Se ci si trova su sistemi Unix, si deve aggiungere allo script una prima linea
   contentente lo &quot;shebang&quot; <code class="literal">#!</code> in modo che il sistema
   sappia quale programma deve interpretare lo script. Sui sistemi Windows si può
   associare <var class="filename">php.exe</var> all&#039;estensione 
   <var class="filename">.php</var>, o si può scrivere un batch per eseguire
   gli script tramite PHP. La prima riga inserita per i sistemi Unix non crea
   problemi in Windows (dal momento che è formattata com un commento PHP), in questo modo
   si possono scrivere batch multi-piattaforma. Qui sotto è mostrato
   un semplice esempio di programma PHP da linea di comando.
  </p>
  
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Example #2 Script sviluppato per essere eseguito da linea di comando (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 />Questo è uno script PHP da linea di comando con una opzione.<br /><br />  Utilizzo:<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; può essere qualsiasi parola che si desidera<br />  stampata. Con --help, -help, -h,<br />  o -? si ottiene questo aiuto.<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">
  Nello script precedente, abbiamo utilizzato la prima riga per indicare
  che questo file deve essere interpretato dal PHP. Poiché qui lavoriamo con la versione <abbr title="Command Line Interpreter/Interface">CLI</abbr>
  non vengono prodotte intestazioni <abbr title="Hypertext Transfer Protocol">HTTP</abbr>.
  </p>
  
  <p class="para">
   Il programma verifica se esiste l&#039;unico il parametro richiesto (in
   aggiunta al nome dello script, che è ugualmente contato). Se non c&#039;è, o se 
   l&#039;argomento è <strong class="option unknown">--help</strong>, <strong class="option unknown">-help</strong>,
   <strong class="option unknown">-h</strong> oppure <strong class="option unknown">-?</strong>, si visualizza il messaggio di aiuto,
   usando <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var> per visualizzare dinamicamente il nome dello script come
   scritto nella linea di comando. Altrimenti, l&#039;argomento è stampato esattamente come
   ricevuto.
  </p>
  
  <p class="para">
   Se si desidera eseguire lo script precedente su Unix, occorre per prima cosa renderlo
   eseguibile, e quindi richiamarlo con <strong class="command">script.php echothis</strong> oppure
   <strong class="command">script.php -h</strong>. Su Windows occorre scrivere un batch
   per ottenere questo risultato:
  </p>
  
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Example #3 File batch per eseguire uno script PHP da linea di comando (script.bat)</strong></p>
    <div class="example-contents">
<div class="shellcode"><pre class="shellcode">@echo OFF
&quot;C:\php\php.exe&quot; script.php %*</pre>
</div>
    </div>

   </div>
  </p>
  
  <p class="para">
   Supponendo che il programma precedente si chiami <var class="filename">script.php</var>, e che la versione
   <abbr title="Command Line Interpreter/Interface">CLI</abbr> di <var class="filename">php.exe</var> sia in <var class="filename">C:\php\php.exe</var>,
   questo batch eseguirà lo script con le opzioni passate:
   <strong class="command">script.bat echothis</strong> oppure <strong class="command">script.bat -h</strong>.
  </p>
  
  <p class="para">
   Vedere anche la documentazione del modulo
   <a href="ref.readline.php" class="link">Readline</a> per informazioni su funzioni
   che possono essere utilizzate per migliorare le applicazioni da linea di comando.
  </p>
  
  <p class="para">
   In Windows, PHP può essere configurato per essere eseguito senza
   fornire il nome <var class="filename">C:\php\php.exe</var> o l&#039;estensione <code class="literal">.php</code>,
   come descritto in <a href="install.windows.commandline.php" class="link">Linea di comando
   PHP su Microsoft Windows</a>.
  </p>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Su Windows si consiglia di eseguire PHP con un account utente effettivo.
    Durante l&#039;esecuzione in un servizio di rete, alcune operazioni avranno esito negativo, perché
    &quot;Non è stata eseguita alcuna mappatura tra i nomi degli account e gli ID di sicurezza&quot;.
   </p>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>