subir studio servidor inicio fin etiquetas ejemplos archivos php include relative-path

studio - php<?= ?>



¿PHP incluye rutas relacionadas con el archivo o el código de llamada? (6)

Tengo problemas para entender el conjunto de reglas con respecto a las rutas de inclusión relativas de PHP. Si ejecuto el archivo A.PHP- y el archivo A.PHP incluye el archivo B.PHP que incluye el archivo C.PHP, si la ruta relativa a C.PHP está relacionada con la ubicación de B.PHP, o la ubicación de A .PHP? Es decir, ¿importa de qué archivo se llama a la inclusión, o solo lo que es el directorio de trabajo actual, y qué determina el directorio de trabajo actual?


  1. Si include path no comienza con ./ o ../ , por ejemplo:

    include ''C.php''; // precedence: include_path (which include ''.'' at first), // then path of current `.php` file (i.e. `B.php`), then `.`.

  2. Si la ruta include comienza con ./ o ../ , por ejemplo:

    include ''./C.php''; // relative to ''.'' include ''../C.php''; // also relative to ''.''

El . o .. arriba es relativo a getcwd() , que por defecto es la ruta del archivo .php entrada (es decir, A.php ).

Probado en PHP 5.4.3 (Fecha de compilación: 8 de mayo de 2012 00:47:34).

(También tenga en cuenta que chdir() puede cambiar la salida de getcwd() .


@Pekka me consiguió allí, pero solo quiero compartir lo que aprendí:

getcwd() devuelve el directorio donde reside el archivo que comenzó a ejecutar.

dirname(__FILE__) devuelve el directorio del archivo que contiene el código que se está ejecutando actualmente.

Al usar estas dos funciones, siempre puede construir una ruta de inclusión relativa a lo que necesita.

Por ejemplo, si b.php y c.php comparten un directorio, b.php puede incluir c.php como:

include(dirname(__FILE__).''/c.php'');

no importa de dónde se llamó b.php.

De hecho, esta es la forma preferida de establecer rutas relativas, ya que el código adicional libera a PHP de tener que iterar a través del include_path en el intento de localizar el archivo de destino.

Fuentes:

Diferencia entre getcwd () y dirname (__ FILE__)? ¿Qué debería usar?

Por qué debería usar dirname ( FILE )


La respuesta aceptada de Pekka es incompleta y, en un contexto general, engañosa. Si el archivo se proporciona como una ruta relativa, el constructo del lenguaje llamado include lo buscará de la siguiente manera.

En primer lugar, recorrerá las rutas de la variable de entorno include_path , que se puede establecer con ini_set . Si esto falla, buscará en el directorio propio del script de llamada dirname(__FILE__) ( __DIR__ con php> = 5.3.) Si esto también falla, ¡solo entonces buscará en el directorio de trabajo! Simplemente resulta que, de forma predeterminada, la variable de entorno include_path comienza con . , que es el directorio de trabajo actual. Esa es la única razón por la que busca primero en el directorio de trabajo actual. Ver http://php.net/manual/en/function.include.php .

Los archivos se incluyen en función de la ruta del archivo proporcionada o, si no se proporciona ninguno, se especifica la ruta de acceso include. Si el archivo no se encuentra en include_path, include finalmente comprobará en el propio directorio del script de llamada y en el directorio de trabajo actual antes de fallar.

Entonces, la respuesta correcta a la primera parte de la pregunta es que importa dónde se encuentra el script de llamada incluido. La respuesta a la última parte de la pregunta es que el directorio de trabajo inicial , en un contexto de servidor web, es el directorio de la secuencia de comandos llamada, la secuencia de comandos que incluye todas las demás mientras está siendo manejado por PHP. En un contexto de línea de comando, el directorio de trabajo inicial es lo que sea cuando se invoca php en el prompt, no necesariamente el directorio donde se encuentra el script llamado. El directorio de trabajo actual , sin embargo, se puede cambiar en tiempo de ejecución con la función PHP chdir . Ver http://php.net/manual/en/function.chdir.php .

Este párrafo se agrega para comentar otras respuestas. Algunos han mencionado que confiar en include_path es menos robusto y, por lo tanto, es preferible utilizar rutas completas como ./path o __DIR__ . /path __DIR__ . /path Algunos llegaron a decir que dependían del directorio de trabajo . en sí no es seguro, porque se puede cambiar. Sin embargo, algunas veces, necesita confiar en los valores del entorno. Por ejemplo, es posible que desee establecer el include_path vacío, de modo que el directorio del script de llamada sea el primer lugar en el que buscará, incluso antes del directorio de trabajo actual. Es posible que el código ya se haya escrito y actualizado regularmente desde fuentes externas y no desee volver a insertar el prefijo __DIR__ cada vez que se actualice el código.


Respuesta corta: es relativa al script incluido.

http://php.net/manual/en/function.include.php explica correctamente:

Si el archivo no se encuentra en include_path, include comprobará en el directorio del script de llamada y en el directorio de trabajo actual

Entonces, si /app/main.php dice include("./inc.php") que encontrará /app/inc.php .

El ./ no es estrictamente necesario, pero elimina cualquier dependencia en include_path.

No confiaría en encontrar archivos incluidos en el directorio de trabajo actual en caso de que alguien lo cambie con chdir() .


Es relativo al guión principal, en este caso A.php. Recuerde que include() solo inserta código en el script actualmente en ejecución.

Es decir, ¿Importa qué archivo se llama a la inclusión desde

No.

Si quiere hacer que importe, y hacer una inclusión relativa a B.php, use la constante __FILE__ (o __DIR__ desde PHP 5.2 IIRC) que siempre apuntará al archivo literal actual en el que se encuentra la línea de código.

include(dirname(__FILE__)."/C.PHP");


dir -> a.php -> c.php - dir2 -> b.php

Para incluir a en b , debe include("../a.php");

Para incluir b en c , debe include("dir2/b.php");