Pregunta

¿Es una buena práctica arrancar su aplicación PHP? Encontré dos formas de iniciar mi aplicación PHP. Necesita algunas sugerencias, que es una mejor manera.

Primero.
Defina una constante para las estructuras de carpetas

$controllerPath = 'controller';
define('CONTROLLER', str_replace('\\', '/', realpath($controllerPath)).'/');

//usage
require_once CONTROLLER . 'somecontroller.php';

Segundo
Usando ini_set establece la ruta de inclusión a la raíz de la aplicación

$rootPath = $_SERVER['DOCUMENT_ROOT'];
$includePath = ini_get('include_path');
ini_set('include_path', '.'.PATH_SEPARATOR.$rootPath.PATH_SEPARATOR.$includePath);

//usage
require_once 'controller/somecontroller.php';

Por favor, dime cuál es una mejor manera.

En el caso de una aplicación de alta carga, ¿cuál sería el mejor método?

¿Fue útil?

Solución

Use ini_set para configurarlo en el directorio -anterior- de su aplicación. Es por eso que puede usar las cadenas literales en sus declaraciones require. Además, facilita el uso del código de reutilización

require 'coolapp/class/Model.php'
require 'coolapp/display/Router.php'
require 'spinoff/display/JsView.php'
// etc

Es similar a la idea en Java de tener importaciones totalmente calificadas de com.whatever.app.more, o cómo en Python todas las importaciones de aplicaciones deberían ser absolutas con respecto a esa aplicación.

Re: Aplicación de alta carga

A menos que esté cargando muchos miles de archivos, el tiempo que lleva incluir archivos probablemente no sea un cuello de botella. Pero, si fuera el caso, tiene un par de opciones. Uno es APC, que almacena en caché los resultados de include en la memoria. Otra es cargar todo desde un solo archivo, similar a cómo los archivos javascript se concatenan en uno para un mejor rendimiento (casualmente, APC tiene una función que le brinda esta información). APC es realmente fácil de configurar y es completamente transparente, para un impulso de ~ 50% mejor rendimiento .

Otros consejos

Es mejor usar rutas absolutas que dejar que PHP encuentre el archivo en una de las rutas incluidas.

Así que, por primera vez, tiendo a usar una constante que contiene la ruta absoluta a la raíz de la aplicación.

Esto es lo que hago:

  • Coloque un directorio / include en la parte superior de la raíz de su documento (o como quiera llamarlo) para todas las clases, funciones auxiliares, etc.
  • Haz que el directorio / include no se sirva usando mod_rewrite;
  • Tenga un archivo allí llamado, digamos, setup.php, que configura parámetros ini relevantes, rutas, etc;
  • Ese archivo se incluye en cada página por ruta relativa; y
  • Todo lo demás puede confiar en la configuración que ha creado.

Ejemplo de reglas de reescritura para .htaccess de nivel superior:

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /include/
RewriteRule ^include/ - [R=404,L]

Podría estar un poco apagado. No tengo mis reglas estándar a mano. Notarás que es un error 404 que creo en lugar de 403 (Prohibido). Eso es deliberado. Cuando inicia sesión en un sistema, no dice & Quot; usuario desconocido & Quot; o " contraseña incorrecta " porque eso te dice algo. Prefiero fingir que no hubo ningún directorio / include en lugar de decir que está allí, pero simplemente no se puede ver.

En ese punto, puede configurar todo lo que necesita para que el resto de su código solo pueda hacer:

require 'Class.php';

o incluso definir un __autoload() para que ocurra automáticamente.

Aquí hay un ejemplo de mi cargador de arranque:

if (!defined('APPLICATION_PATH')) {
    define('APPLICATION_PATH', realpath(getcwd() . '/../application'));
}

/**
 * Add the APPLICATION_PATH and the library dir to the include_path
 */
set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . PATH_SEPARATOR . realpath(APPLICATION_PATH . '/../library'));

/**
 * Load the file loader to setup the class autoloader
 */
include_once 'Loader.php';
if (!class_exists('Loader')) {
    die('Could not load class loader.');
}

spl_autoload_register('Loader::autoload');

Yo personalmente iría con la segunda forma. Aprendí a amar el include_path: probablemente haya algún impacto en el rendimiento al buscar en muchos directorios, pero dudo que sea significativo. También evita que los errores olviden incluir la ruta constante.

En una nota al margen, puse mis controladores, etc. en /application/, y tengo algunas bibliotecas en /library/. Todo esto va por encima de la raíz web. Impide completamente que los usuarios accedan a estos archivos, de lo que debe tomar precauciones si tiene todo debajo de la raíz del documento. Si su host lo admite (algunos hosts compartidos no lo hacen) ¡aprovéchelo!

Actualizar

  

En caso de una aplicación de alta carga, ¿es bueno usar el segundo método?

En mi opinión, si estuviera atento a lo que hay en su include_path (por ejemplo, en mi máquina de desarrollo de Windows tengo todo tipo de cosas que no necesito: SQL Server, Ruby, etc.) y Si eliminaran todo lo que no sea necesario, el segundo método estaría bien.

Otra cosa que podría hacer es volcar el require al final del script y codificarlo en su archivo php.ini.

Realmente, sin embargo. No creo que esto vaya a ser un cuello de botella en el rendimiento de su sistema. Usa lo que es más fácil para ti.

¿Tiene problemas de rendimiento en un sitio que está ejecutando o son precauciones? Puedo ver por qué quieres preoptimizar (tengo que evitar hacerlo) pero en serio. Trata esos problemas cuando surjan. Cuando estás en la posición afortunada de tener un sitio popular, trata con él. Al final del día, no es una pesadilla si tiene que reemplazar algunos <=> s.

Prefiero la segunda forma: la utilicé en un gran proyecto PHP y la disfruté mucho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top