2009-08-13 15 views
7

Da dentro un programma PHP voglio conoscere la posizione del file binario che lo sta eseguendo. Perl ha $^X per questo scopo. Esiste un equivalente in PHP?Come posso trovare l'eseguibile PHP attualmente in esecuzione?

Questo è così può eseguire un processo PHP figlio che utilizza se stesso (piuttosto che un codice fisso un percorso o si presuppone che "php" sia corretto).

UPDATE

  1. sto usando lighttpd + FastCGI, non Apache + mod_php. Quindi sì, c'è un binario PHP.
  2. eval/include non è una soluzione perché sto generando un server che deve sopravvivere oltre la richiesta.

Le cose che ho provato e non lavoro:

  • $_SERVER['_'] sembra che quello che voglio da riga di comando, ma la sua realtà da una variabile d'ambiente impostata dalla shell dell'ultimo giustiziato programma. Quando viene eseguito da un server Web questo è il binario del server Web.
  • which php non funziona perché il file binario di PHP non è garantito come lo stesso nel server Web PATH.

Grazie in anticipo.

risposta

14

La costante PHP_BINDIR ti dà la directory in cui il file binario php è

+1

La cosa più vicina che ho già sentito, grazie. – Schwern

+0

Eppure alcune persone mi votano, probabilmente perché non l'hanno testato :) Sono contento di aiutare. – Lepidosteus

+1

Lo uso nella mia console iphp. È stato affidabile per me – apinstein

2

Sì, $_SERVER['_'] è quello di cui stai parlando, o il più vicino che esiste. Il motivo per cui si ottiene un binario del server Web quando viene eseguito dal Web è che /usr/bin/php non ha nulla a che fare con l'esecuzione del server Web; ciò che è in esecuzione è un SAPI separato. Non c'è niente dall'istanza web PHP in modo che punti a /usr/bin/php perché non c'è ragione per esserci.

+0

Nessun motivo ... tranne quello indicato nella mia domanda. – Schwern

+0

@schwern: ma se l'eseguibile è il server web e php è usato solo come libreria, perché dovrebbe esserci un motivo per puntare a un binario php se non viene usato. C'è una differenza con il modo in cui i server web usano perl perché nella maggior parte dei casi l'interfaccia è CGI e ciò significa eseguire l'eseguibile perl (ci sono delle eccezioni). Direi che la soluzione migliore è una stringa di configurazione o utilizzare eval() se questo è abbastanza buono per le tue esigenze. – Fredrik

+0

@Schwern: Se si * cancellato * '/ usr/bin/php', il server Web continuerà a elaborare i file PHP correttamente. Non so come dirti perché non esiste una ragione * tecnica * per un collegamento tra loro più chiaro di così. – chaos

0

A seconda del modo in cui PHP è installato non riesci a trovare il file eseguibile php. se php è in esecuzione come modulo per il server web come il modulo apache, quindi non esiste un binario da chiamare. puoi dare un'occhiata a php_info() elenca tutto. potrebbe anche il percorso per php. all'interno di quel percorso puoi assumere un binario php.

ma perché si desidera chiamare un processo aggiuntivo? è possibile eseguire altri file php includendo comando o eval. non c'è alcun motivo per generare un nuovo processo.

+0

Forse voglio generare un server? – Schwern

+0

+1 semplicemente perché non vedo un motivo per questo essere -1 – Fredrik

-2

che dire: <?php exec("which php"); ?>

Ma, è unix/linux solo: D

+1

Non c'è assolutamente alcuna garanzia che il binario PHP che ha eseguito il programma sia lo stesso del binario PHP nel tuo percorso. Nella mia situazione questo non è esplicitamente così. – Schwern

1

Il PHP_BINDIR costante è probabilmente la cosa più facile da usare; la cosa migliore che potrei venire in mente è fondamentalmente ricreare quel percorso bindir dalla impostazione di configurazione extension_dir:

$phpbin = preg_replace("@/lib(64)?/.*[email protected]", "/bin/php", ini_get("extension_dir")); 

Ha una regex in esso, così ci si sente più come il vostro perl nativa ma per il resto (!) non è particolarmente ottimale.

1

In PHP5.4 è possibile utilizzare il PHP_BINARY costante, non funzionerà tramite mod_php o simili, ma sarà tramite CGI ecc

Per le versioni precedenti di PHP readlink('/proc/self/exe'); sarà probabilmente bene, ancora una volta non lo farà funziona tramite mod_php.

-1

Ho cercato l'eseguibile per php7 sul mio mac (OSX El Capitan) per configurare e installare xdebug (necessario per trovare la versione corretta di phpize da eseguire). Nessuna delle soluzioni che ho trovato ha funzionato per me, così ho concluso fuori alla ricerca di esso:

find/-name php -print 

sapevo (da phpinfo()) che stavo correndo php7, così mi è stato in grado di dedurre la directory corretta da le opzioni presentate da trovare.

+0

Grazie, ma questo non risponde alla domanda. Un programma non può interpretare la lista come una scatola umana. L'umano sta solo indovinando qual è quello giusto (fonte di molte ore di frustrazione). E quello cerca solo i file con il nome "php", l'interprete che sta per essere eseguito potrebbe essere chiamato qualsiasi cosa. – Schwern

Problemi correlati