2009-08-13 20 views
7

Desde dentro de un programa PHP, quiero saber la ubicación del binario que lo ejecuta. Perl tiene $^X para este propósito. ¿Hay un equivalente en PHP?¿Cómo averiguo el ejecutable PHP actualmente en ejecución?

Esto es para que pueda ejecutar un proceso PHP hijo usándose a sí mismo (en lugar de codificar una ruta o asumir que "php" es correcto).

ACTUALIZACIÓN

  1. estoy usando lighttpd + FastCGI, no Apache + mod_php. Entonces sí, hay un binario PHP.
  2. eval/include no es una solución porque estoy generando un servidor que tiene que vivir más allá de la solicitud.

cosas que he intentado y no trabajo:

  • $_SERVER['_'] parece que lo que quiero de la línea de comandos pero en realidad es de una variable de entorno establecido por la cáscara del último ejecutado programa. Cuando se ejecuta desde un servidor web, este es el servidor web binario.
  • which php no funcionará porque no se garantiza que el binario de PHP sea el mismo que el del servidor web PATH.

Gracias de antemano.

Respuesta

14

La constante PHP_BINDIR le da el directorio en el binario de PHP es

+1

Lo más cercano que he escuchado hasta ahora, gracias. – Schwern

+0

Sin embargo, algunas personas me votan, probablemente porque no lo probaron :) Me alegra ayudar. – Lepidosteus

+1

Lo uso en mi consola iphp. Ha sido confiable para mí – apinstein

2

Sí, $_SERVER['_'] es de lo que está hablando, o tan cerca como existe. La razón por la que obtiene un servidor web binario cuando se ejecuta desde la web es que /usr/bin/php no tiene nada que ver con la ejecución del servidor web; lo que está ejecutando es una SAPI separada. No hay nada de la instancia de PHP web que apunte a /usr/bin/php porque no hay ninguna razón para que exista.

+0

No hay razón ... excepto la indicada en mi pregunta. – Schwern

+0

@schwern: pero si el ejecutable es el servidor web y php solo se utiliza como biblioteca, ¿por qué habría una razón para apuntar a un binario php si no se utiliza? Existe una diferencia con la forma en que los servidores web usan Perl porque en la mayoría de los casos la interfaz es CGI y eso significa ejecutar el ejecutable de Perl (hay excepciones). Diría que su mejor apuesta es una cadena de configuración o use eval() si es lo suficientemente bueno para sus necesidades. – Fredrik

+0

@Schwern: si * eliminaste * '/ usr/bin/php', tu servidor web continuaría procesando archivos PHP sin problemas. No sé cómo decirte por qué no hay una razón * técnica * para un vínculo entre ellos más claro que eso. – chaos

0

Dependiendo de la forma en que PHP está instalado no puede encontrar el ejecutable php. si php se está ejecutando como un módulo para el servidor web como el módulo de apache, entonces no hay un binario al que pueda llamar. puede echar un vistazo a php_info() que enumera todo. también puede el camino a php. dentro de ese camino puedes asumir un php binario.

pero ¿por qué quieres llamar a un proceso extra? puede ejecutar otros archivos php mediante include command o eval. no hay razón para generar un nuevo proceso.

+0

¿Quizás quiero generar un servidor? – Schwern

+0

+1 simplemente porque no veo una razón para que este sea -1 – Fredrik

-2

qué pasa: <?php exec("which php"); ?>

Pero, es Unix/Linux: D

+1

No hay absolutamente ninguna garantía de que el binario de PHP que ejecutó el programa sea el mismo que el binario de PHP en su ruta. En mi situación, esto no es explícitamente así. – Schwern

1

El PHP_BINDIR constante es probablemente la cosa más fácil de usar; la siguiente mejor cosa que podría llegar a es básicamente volver a crear ese camino bindir de la opción de configuración extension_dir:

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

Tiene una expresión regular en él, así que se siente más como su Perl nativo pero por lo demás (!) no es especialmente óptimo.

1

En PHP5.4 puede utilizar el PHP_BINARY constante, no va a funcionar a través de mod_php o similar, pero será a través de CGI etc.

Para versiones anteriores de PHP readlink('/proc/self/exe'); probablemente va a estar bien, una vez más no lo hará trabajar a través de mod_php.

-1

He estado buscando el ejecutable php7 en mi mac (OSX El Capitan) para configurar e instalar xdebug (necesario para encontrar la versión correcta de phpize para ejecutar). Ninguna de las soluciones que encontré trabajó para mí, así que acaba de terminar a cabo la búsqueda de ella:

find/-name php -print 

supe (de phpinfo()) que estaba corriendo php7, así que fue capaz de inferir el directorio correcto de las opciones presentadas por find.

+0

Gracias, pero esto no responde la pregunta. Un programa no puede interpretar la lista como una lata humana. El humano simplemente adivina cuál es la correcta (una fuente de muchas horas de frustración). Y eso solo busca archivos llamados "php", el intérprete actual que se ejecuta podría llamarse cualquier cosa. – Schwern

Cuestiones relacionadas