2009-11-11 13 views
16

Siempre me interesan formas más eficientes y aprender cosas nuevas. En este momento, estoy usando el código <?php include('config.php'); ?> en todos y cada uno de los archivos. Dependiendo de dónde esté el archivo en mi estructura de carpetas, tendría <?php include('../config.php'); ?> o incluso <?php include('../../config.php'); ?>. ¿Cómo puedo hacerlo más eficiente? ¿Hay alguna manera de tener mi config.php en la raíz y hacer que todo en la raíz requiera config.php?¿Cómo incluir config.php de manera eficiente?

+0

Si ejecuta Apache, http://stackoverflow.com/questions/24622/setting-php-include-path-on-a-per-site-basis puede ser una opción? – zak

Respuesta

17

hay una manera de incluir un archivo de forma automática (auto_prepend_file ini setting), sin embargo, la mayor mejora que puede hacer es abandonar el uso de múltiples archivos php y usar index.php como un único punto de entrada para todo el sitio web.

supongamos que escribe un clon SO;) con las páginas "preguntas", "etiquetas", "usuarios", etc. En cada página necesita algunas cosas php genéricas (db, sesión) + elementos html comunes (encabezado, pie de página). Un enfoque popular es tener un grupo de archivos php (questions.php, tags.php, users.php) cada uno de ellos incluye las cosas en común. Por ejemplo, users.php se verá así entonces

include 'db.php'; 
include 'session.php'; 
include 'html.header.php'; 
.....users-specific stuff 
include 'html.footer.php'; 

Esto es bastante tedioso (usted tiene que repetir un montón de código) e inflexible (piensa añadir una barra lateral para todas las páginas en el sitio). Mi sugerencia es hacer que incluye "adentro hacia afuera", es decir, tener un archivo de "cosas comunes" que incluye específica de la página de código:

# index.php 
db functions 
session functions 
html header 

$page = isset($_GET['page']) 
    ? preg_replace("/\W+/", "", $_GET['page']) 
    : "home"; 
include "$page.php"; 

html footer 

Por lo tanto usted tendrá un único punto de entrada en la página web - esto es más flexible y mejor para la depuración. El único inconveniente es que las URLs son menos "buena" (vs user.php index.php? Page = usuario?), Pero esto se puede solucionar fácilmente con mod_rewrite

+2

? ¿De qué manera es eso una mejora? rendimiento, mantenibilidad, etc. – nickf

+0

Siempre que haya algún tipo de plantilla en proceso (que debería haber) creo que funciona bastante bien como un replanteamiento del problema. – Kzqai

+0

Me gusta esta respuesta la mejor. Hay muchas maneras de acelerar este proceso, como usar un marco para automatizarlo. Puedo recomendar algunos si quieres. – Tres

17

poner la ruta que contiene config.php en su php include path y entonces usted puede simplemente hacer esto:

include 'config.php'; 

o mejor aún:

require_once 'config.php'; 

require se prefiere sobre include, ya que provoca un error en lugar de una advertencia cuando un archivo no se puede incluir por algún motivo (por ejemplo, archivo no encontrado, error de permisos, etc.). El sufijo _once es una buena adición para asegurarse de que el mismo archivo no se incluya innecesariamente varias veces.

Además, tenga en cuenta que no necesita el paréntesis alrededor de 'config.php' en su llamada include. include no es una función en php. Es una construcción de lenguaje. El paréntesis solo sirve como una agrupación innecesaria similar a este ejemplo: $myVar = (2 + 2);.

+1

Agradecimiento especial por la nota entre paréntesis. – Strawberry

+2

Con la creciente popularidad de los proveedores de Paas y entornos de desarrollo disjuntos en general, esto no es recomendable. Supongamos que está creando una aplicación web y desea compartir su código y transferir el proyecto. ¿Realmente desea exigir a cada desarrollador que tiene en sus manos el proyecto que configure su php.ini interno solo para hacer que su aplicación funcione? – Seph

8

Puede hacer una base constante dir

define('BASE_DIR', realpath(__FILE__)); 

poner esto en su index.php

entonces usted puede hacer

include BASE_DIR . 'config.php'; 
+0

esto también es útil para muchos usos diferentes; siempre es bueno tener algunas constantes de ruta definidas una vez para su aplicación. – nickf

+0

Normalmente tengo un BASE_DIR y DOC_ROOT .. BASE_DIR para directorios que PHP usa, y DOC_ROOT como un prefijo para rutas de acceso HTML, etc. – alex

+0

@Alex - ¿Necesitaría establecer el BASE_DIR como una variable de sesión en la página uno para poder usar en páginas más profundas o PHP mantiene esto en la memoria? – JM4

2

diferentes opciones que se pueden combinar:

  • Cree definiciones de ruta en un archivo de recursos que no se rastreará en su control de origen. p.ej.define ('LIB_PATH', '/ home/tchalvak/project /');

  • Especifique un archivo de autopreparación y configúrelo en php.ini. p.ej. incluyendo una lista de scripts global, utilizada en todas partes, a la que puede agregar o quitar sobre la marcha.

  • Por último, un poco de engaño trayectoria de manipulación de cadenas que he encontrado o se acercó con, no recuerdo cuál:

    require_once(substr(__FILE__, 0, (strpos(__FILE__, 'lib/')))."resources.php"); // requieren un archivo en una relación específica con otro archivo conocido, sin tener en cuenta de la ruta real involucrada, y sin tratar con ninguna define.

+0

Además de poner un archivo directamente en la ruta de inclusión php como Asaph dice más arriba. Extrañamente, nunca lo he hecho de esa manera. Me pregunto si hay una desventaja al compartir proyectos o algo así. No es seguro. – Kzqai

2

Aquí es cómo voy sobre la gestión de mis requeridas (incluir) archivos:

Cuando puedo, nunca usar constantes o variables (para definir la ruta absoluta) en mis archivos necesarios. Encuentro que esto tiene algunas ventajas:

  1. No tengo que cambiar una constante para cada versión del sitio web que despliego.
  2. Las herramientas de análisis estático como PHPLint no funcionan con este tipo de inclusiones.
  3. Mi editor (Eclipse) me permite navegar a un archivo requerido mediante el control + clic en el nombre de archivo requerido.
  4. Es más fácil de compartir archivos entre proyectos (sin tener que editar los caminos necesarios)
  5. ...

... Pero para hacer esto, todos requiere e incluye necesita ser relativa. Por defecto, PHP usa el directorio actual del script llamado para establecer su ruta include. Esto puede causar problemas cuando los scripts llamados no residen en la misma carpeta. Por lo tanto, la sugerencia de que todas las solicitudes pasen por un único script elimina automáticamente dichos problemas.

Cuestiones relacionadas