2010-03-03 59 views
16

Voglio eseguire un programma cli PHP da PHP cli. Su alcune macchine su cui verrà eseguito, sono installati sia php4 che php5. Se eseguo il programma esterno comeOttieni l'eseguibile PHP corrente dallo script?

php5 outer.php 

Voglio che lo script interno venga eseguito con la stessa versione di php. In Perl, userei $^X per ottenere l'eseguibile perl. Sembra che non ci sia una tale variabile in PHP?

Al momento, sto usando $_SERVER['_'], perché bash (e zsh) impostano la variabile di ambiente $_ nel programma di ultima esecuzione. Ma preferirei non fare affidamento su un linguaggio specifico della shell.

AGGIORNAMENTO: Le differenze di versione sono un problema. Se PHP non è in PATH, per esempio, o non è la prima versione trovata in PATH, i suggerimenti per trovare le informazioni sulla versione non saranno d'aiuto.

Inoltre, csh e le varianti sembrano non impostare la variabile di ambiente $_ per i loro processi, quindi la soluzione alternativa non è applicabile lì.

UPDATE 2: stavo usando $_SERVER['_'], fino a quando ho scoperto che non fa la cosa giusta in xargs (che ha un senso ... zsh imposta in modo che il comando ha funzionato, che è xargs, non php5 e xargs non modifica la variabile). Tornare all'uso:

$version = explode('.', phpversion()); 
$phpcli = "php{$version[0]}"; 
+0

E 'possibile semplicemente includere condizionatamente l'altro file PHP? Questo è il modo più semplice per assicurare che il codice incluso venga eseguito con lo stesso interprete del codice incluso. – meagar

+0

Punto interessante. In questo caso particolare, parte del motivo per cui viene eseguito come sottoprocesso è che lo script interno chiama "exit()" in vari punti. – benizi

risposta

28

Da segnalare che la società in PHP 5.4+ è possibile utilizzare la costante predefinita - PHP_BINARY:

PHP_BINARY

Specifica il percorso binario PHP durante l'esecuzione di script. Disponibile da PHP 5.4.

+0

Yay. Grazie per l'aggiornamento. – benizi

+0

Nota: in Apache2handler viene restituito il percorso 'httpd'. –

+0

nota: restituisce 'php-cgi' e non' php' nel mio caso (windows) – ThaDafinser

-1

È possibile provare e analizzare il risultato phpinfo().

1

C'è qualcosa di utile in $_ENV?

La variabile di ambiente SHELL su Unix ha il percorso della shell attualmente in esecuzione. Se aggiungi #!/path/to/php nella parte superiore del file PHP, rendilo eseguibile ed esegui direttamente il file, lo $_ENV['SHELL'] contiene /path/to/php?

+0

'$ _ENV' contiene la stessa voce' _' popolata in '$ _SERVER', ma no,' $ _ENV ['SHELL'] 'non contiene il valore corretto (' "/ bin/zsh" '). – benizi

3

Okay, quindi questo è brutto, ma funziona su Linux:

<?php 
    // Returns the full path of the current PHP executable 
    function get_proc_name(){ 
     // Gets the PID of the current executable 
     $pid = posix_getpid(); 

     // Returns the exact path to the PHP executable. 
     $exe = exec("readlink -f /proc/$pid/exe"); 
     return $exe; 
    } 

proverò a lavorare su una versione di Windows in seguito.

EDIT

non sembra che ci sia un modo semplice per fare questo per Windows. Alcuni eseguibili di Windows come tasklist possono darti il ​​nome dell'eseguibile, ma non il percorso completo in cui si trova l'eseguibile. Sono stato solo in grado di trovare esempi per trovare il percorso completo dato un PID per C++, AutoHotkey e simili. Se qualcuno ha qualche suggerimento su dove altro potrei guardare, fammi sapere.

PS: per ottenere il PID in PHP per Windows, è necessario chiamare lo getmypid().

+0

Stavo anche cercando di farlo. Ho pensato che avrei potuto usare le estensioni PECL [w32api] (http://pecl.php.net/package/w32api) o [ffi] (http://pecl.php.net/package/ffi) per chiamare la funzione API [GetModuleFileName] (http://msdn.microsoft.com/en-us/library/ms683197%28v=vs.85%29.aspx), ma nessuna estensione sembra essere attivamente mantenuta al momento. –

+2

Invece di contraffare con '$ pid' puoi sempre dare un'occhiata a' "/ proc/self/exe" ' –

+0

Amo questa soluzione btw! –

0

risposta è stata utile per rintracciare una posizione php: How to get the path of the PHP BIN from PHP?

E 'anche Windows e Linux amichevole :)

+0

Vedere il mio primo aggiornamento a questa domanda. Tutto ciò che si basa su PATH è soggetto a errori (la versione corrente potrebbe non essere affatto in PATH, o potrebbe non essere la prima versione che una ricerca PATH potrebbe trovare). – benizi

+0

D'accordo, non è il metodo migliore. Ma per qualcosa che è indipendente dalla piattaforma è tutto ciò che ho potuto trovare. – SeanDowney

8

Sul mio server ho php 5.3.14.

ho trovato un costante predefinita: PHP_BIN_DIR

Quindi, supponendo che il nome del file del file eseguibile è sempre 'php', $php_cmd = PHP_BIN_DIR.'/php' punto al mio file eseguibile PHP.

+4

[Secondo il manuale] (http://www.php.net/manual/en/reserved.constants.php), che non dice quando è stato aggiunto, è 'PHP_BINDIR' (nessun secondo trattino basso). Questa è una risposta abbastanza decente. Grazie. – benizi

+8

Ho svettato la risposta e il commento, ma ho ripreso i voti dopo averlo provato in Windows. Restituirà sempre 'C: \ php' indipendentemente dalla realtà. –

-1

Penso che il meglio costante PHP_BINARY. Con PHP 5.5.12

+0

Sembra identico a [risposta accettata] (http://stackoverflow.com/questions/2372624/get-current-php-executable-from-within-script/9182368#9182368). – Pang

-1

So che questa domanda è un po 'vecchia, ma è venuta fuori cercando un modo più breve per farlo.

Purtroppo non riesco a trovare un modo più breve, ma questo funziona abbastanza bene ed è compatibile con la versione multi OS/PHP.

$ lookIn potrebbe probabilmente essere esteso per includere più posizioni comuni.

https://gist.github.com/cjsewell/39b60065ae2af677ceb1

Speranza che aiuta qualcuno

1

Purtroppo PHP_BINARY sta tornando il binario httpd (su Windows XAMPP), quindi sono tornati a utilizzare i percorsi ...

if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server')) && is_file(PHP_BINARY)) { 
      return PHP_BINARY; 
    } else if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 
     $paths = explode(PATH_SEPARATOR, getenv('PATH')); 
     foreach ($paths as $path) { 
      if (substr($path, strlen($path)-1)==DIRECTORY_SEPARATOR) { 
       $path=substr($path, 0, strlen($path)-1); 
      } 
      if (substr($path, strlen($path) - strlen('php')) == 'php') { 
       $response=$path.DIRECTORY_SEPARATOR.'php.exe'; 
       if (is_file($response)) { 
        return $response; 
       } 
      } else if (substr($path, strlen($path) - strlen('php.exe')) == 'php.exe') { 
       if (is_file($response)) { 
        return $response; 
       } 
      }     
     } 
    } else { 
     $paths = explode(PATH_SEPARATOR, getenv('PATH')); 
     foreach ($paths as $path) { 
      if (substr($path, strlen($path)-1)==DIRECTORY_SEPARATOR) { 
       $path=substr($path, strlen($path)-1); 
      } 
      if (substr($path, strlen($path) - strlen('php')) == 'php') { 
       if (is_file($path)) { 
        return $path; 
       } 
       $response=$path.DIRECTORY_SEPARATOR.'php'; 
       if (is_file($response)) { 
        return $response; 
       } 
      }    
     } 
    } 
    return null; 
+0

Qualcuno l'ha provato? Funziona? Coerentemente e attraverso Win e Unix? Il codice è brutto, ma se funziona, lo normalizzerò. – XedinUnknown

+0

So che questa è una vecchia risposta e nessuno ha risposte @XedinUnknown, ma posso confermare che funziona perfettamente su Windows che esegue XAMPP. Qualcun altro l'ha testato in più ambienti? – Blizzardengle

Problemi correlati