otra - ¿Cómo incluir archivos PHP que requieren una ruta absoluta?
llamar funcion php desde otro php (11)
Tengo una estructura de directorios como la siguiente;
script.php
inc / include1.php
inc / include2.phpobjetos / object1.php
objetos / object2.phpjabón / soap.php
Ahora, uso esos objetos en script.php
y /soap/soap.php
, podría moverlos, pero quiero la estructura del directorio así por una razón específica. Al ejecutar script.php
la ruta include es inc/include.php
y al ejecutar /soap/soap.php
es ../inc
, las rutas absolutas funcionan, /mnt/webdev/[project name]/inc/include1.php...
Pero es una solución fea si alguna vez quiero mover el directorio a una ubicación diferente.
Entonces, ¿hay alguna manera de usar rutas relativas, o una forma de generar de forma "/mnt/webdev/[project name]/"
?
@Flubba, ¿esto me permite tener carpetas dentro de mi directorio de inclusión? los directorios de inclusión plana me dan pesadillas. como todo el directorio de objetos debe estar en el directorio inc.
Oh sí, absolutamente. Entonces, por ejemplo, usamos una sola capa de subcarpetas, generalmente:
require_once(''library/string.class.php'')
Debe tener cuidado al depender demasiado de la ruta de inclusión en sitios de mucho tráfico, porque php tiene que buscar en el directorio actual y luego en todos los directorios en la ruta de inclusión para ver si su archivo está allí y esto puede ralentizar. cosas si te están martillando.
Entonces, por ejemplo, si está haciendo MVC, colocaría la ruta de acceso al directorio de la aplicación en la ruta de inclusión y luego especificará las cosas en el formulario
''model/user.class''
''controllers/front.php''
o lo que sea.
Pero en términos generales, simplemente te permite trabajar con rutas realmente cortas en tu PHP que funcionarán desde cualquier lugar y es mucho más fácil de leer que todas las malarkey raíz de documentos de realpath.
El beneficio de las alternativas basadas en scripts que otros han sugerido es que funcionan en cualquier parte, incluso en cajas compartidas; establecer la ruta de inclusión requiere un poco más de reflexión y esfuerzo, pero como mencioné, puedes empezar a usar __autoload, que es el más genial.
¡Me pareció que esto funcionaba muy bien!
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
Utilizar:
<?php
function findRoot() {
return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}
include(findRoot() . ''Post.php'');
$posts = getPosts(findRoot() . ''posts_content'');
include(findRoot() . ''includes/head.php'');
for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
$posts[$i]->displayArticle();
}
include(findRoot() . ''includes/footer.php'');
?>
Creo que la mejor manera es poner tus inclusiones en tu ruta de inclusión de PHP. Hay varias maneras de hacer esto dependiendo de su configuración.
Entonces, simplemente puede referirse a
require_once ''inc1.php'';
desde dentro de cualquier archivo, independientemente de dónde se encuentre, ya sea en sus inclusiones o en sus archivos accesibles en la web, o en cualquier nivel de subdirectorios anidados.
Esto le permite tener sus archivos de inclusión fuera de la raíz del servidor web, lo cual es una práctica recomendada.
p.ej
site directory
html (web root)
your web-accessible files
includes
your include files
Además, consulte __autoload para la carga diferida de archivos de clase
Esto debería funcionar
$root = realpath($_SERVER["DOCUMENT_ROOT"]);
include "$root/inc/include1.php";
Editar: imporvement añadido por aussieviking
Otra forma de manejar esto que elimina cualquier necesidad de incluir en absoluto es utilizar la función de autoload . Incluir todo lo que su script necesita "Just in Case" puede impedir el rendimiento. Si sus includes son todas las definiciones de clase o interfaz, y desea cargarlas solo cuando sea necesario, puede sobrecargar la __autoload()
con su propio código para encontrar el archivo de clase apropiado y cargarlo solo cuando se lo llame. Aquí está el ejemplo del manual:
function __autoload($class_name) {
require_once $class_name . ''.php'';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
Siempre que configure las variables include_path en consecuencia, nunca necesitará volver a incluir un archivo de clase.
Otra opción, relacionada con Kevin, es usar __FILE__
, pero en su lugar, reemplace el nombre del archivo php dentro de él:
<?php
$docRoot = str_replace($_SERVER[''SCRIPT_NAME''], '''', __FILE__);
require_once($docRoot . ''/lib/include.php'');
?>
He estado usando esto por un tiempo. El único problema es que a veces no tienes $_SERVER[''SCRIPT_NAME'']
, pero a veces hay otra variable similar.
Podría definir una constante con la ruta al directorio raíz de su proyecto, y luego poner eso al comienzo de la ruta.
Puede usar rutas relativas. Prueba __FILE__
. Esta es una constante de PHP que siempre devuelve la ruta / nombre de archivo del script en el que se encuentra. Por lo tanto, en soap.php
, podrías hacer lo siguiente:
include dirname(__FILE__).''/../inc/include.php'';
La ruta completa y el nombre del archivo. Si se usa dentro de una inclusión, se devuelve el nombre del archivo incluido. Desde PHP
__FILE__
,__FILE__
siempre contiene una ruta absoluta con enlaces simbólicos resueltos, mientras que en versiones anteriores contenía la ruta relativa en algunas circunstancias. (source)
Otra solución sería establecer una ruta de inclusión en su httpd.conf o un archivo .htaccess.
Si va a incluir una ruta específica en la mayoría de los archivos en su aplicación, cree una variable Global en su carpeta raíz.
define("APPLICATION_PATH", realpath(dirname(__FILE__) . ''/../app''));
or
define("APPLICATION_PATH", realpath(DIR(__FILE__) . ''/../app''));
Ahora, esta variable global " APPLICATION_PATH " se puede utilizar para incluir todos los archivos en lugar de llamar a realpath () cada vez que incluya un nuevo archivo.
EX:
include(APPLICATION_PATH ."/config/config.ini";
Espero eso ayude ;-)
echa un vistazo a http://au.php.net/reserved.variables
Creo que la variable que está buscando es: $_SERVER["DOCUMENT_ROOT"]
require(str_repeat(''../'',(substr_count(getenv(''SCRIPT_URL''),''/'')-1))."/path/to/file.php");
Yo uso esta línea de código. Vuelve a la "parte superior" del árbol del sitio, luego va al archivo deseado.
Por ejemplo, digamos que tengo este árbol de archivos:
domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php
Puedo incluir el archivo functions.php desde donde sea que esté, simplemente copiando
require(str_repeat(''../'',(substr_count(getenv(''SCRIPT_URL''),''/'')-1))."/_resources/functions.php");
Si necesita usar este código muchas veces, puede crear una función que devuelva la parte str_repeat(''../'',(substr_count(getenv(''SCRIPT_URL''),''/'')-1))
. Luego solo inserta esta función en el primer archivo que incluyas. Tengo un archivo "initialize.php" que incluyo en la parte superior de cada página php y que contiene esta función. La próxima vez que tengo que incluir archivos, de hecho solo uso la función (llamada path_back
):
require(path_back()."/_resources/another_php_file.php");