Domanda

È buona norma avviare la propria applicazione PHP. Ho trovato due modi per avviare la mia applicazione PHP. Hai bisogno di alcuni suggerimenti che è un modo migliore.

Primo.
Definire una costante per le strutture delle cartelle

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

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

Secondo
Utilizzando ini_set impostare il percorso di inclusione sulla radice dell'applicazione

$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';

Per favore, dimmi qual è il modo migliore.

Nel caso di un'applicazione ad alto carico quale sarebbe il metodo migliore ??

È stato utile?

Soluzione

Usa ini_set per impostarlo sulla directory -above- la tua applicazione. Ecco perché puoi usare le stringhe letterali nelle tue istruzioni request. Inoltre, semplifica l'utilizzo del codice di riutilizzo

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

È simile all'idea in Java di avere importazioni pienamente qualificate di com.whatever.app.more, o come in Python tutte le importazioni di un'app dovrebbero essere assolute rispetto a quell'app.

Ri: Applicazione con carico elevato

A meno che tu non stia caricando molte migliaia di file, il tempo necessario per includere i file probabilmente non è un collo di bottiglia. Ma, se fosse il caso, hai un paio di opzioni. Uno è APC, che memorizza nella cache i risultati di include in memoria. Un altro è caricare tutto da un singolo file, in modo simile al modo in cui i file javascript sono concatenati in uno per prestazioni migliori (per coincidenza, APC ha una funzione che ti fornisce queste informazioni). APC è davvero facile da configurare ed è completamente trasparente, per una spinta di ~ 50% prestazioni migliori .

Altri suggerimenti

Meglio usare percorsi assoluti che lasciare che PHP trovi il file in uno dei percorsi include inclusi.

Quindi tendo per la prima volta ad usare una costante che trattiene il percorso assoluto della radice dell'applicazione.

Questo è quello che faccio:

  • Inserisci una directory / include nella parte superiore della radice del documento (o come vuoi chiamarla) per tutte le classi, le funzioni di supporto e così via;
  • Rendi tale che la directory / include non sia servita usando mod_rewrite;
  • Inserisci un file chiamato, diciamo, setup.php, che imposta parametri ini, percorsi, ecc .;
  • pertinenti
  • Il file è incluso in ogni pagina per percorso relativo; e
  • Tutto il resto può quindi fare affidamento sulle impostazioni che ha creato.

Esempio di regole di riscrittura per .htaccess di livello superiore:

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

Potrei essere leggermente fuori. Non ho le mie regole standard a portata di mano. Noterai che è un errore 404 che creo piuttosto che 403 (proibito). È deliberato. Quando si accede a un sistema, non compare & Quot; utente sconosciuto & Quot; oppure " password " errata; perché questo ti dice qualcosa. Preferirei fingere che non esistesse alcuna directory / include piuttosto che dire che è lì, ma non puoi guardarla.

A quel punto puoi impostare tutto ciò di cui hai bisogno in modo che il resto del tuo codice possa fare semplicemente:

require 'Class.php';

o addirittura definire un __autoload() in modo che accada automaticamente.

Ecco un esempio del mio caricatore bootstrap:

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');

Andrei personalmente con la seconda strada. Ho imparato ad amare il include_path: probabilmente c'è un po 'di performance da guardare in molte directory ma dubito che sarebbe significativo. Inoltre impedisce agli errori di dimenticare di includere la costante di percorso.

In una nota a margine ho messo i miei controller, ecc. in /application/, e ho alcune librerie in /library/. Tutto ciò va al di sopra della radice del web. Impedisce completamente agli utenti di accedere a questi file, che altrimenti dovresti prendere precauzioni se hai tutto sotto la radice del documento. Se il tuo host supporta questo (alcuni host condivisi no) approfittane!

Aggiornamento

  

Nel caso di un'applicazione ad alto carico è bene andare con il secondo metodo ??

Secondo me se dovessi tenere d'occhio ciò che è nel tuo include_path (ad esempio, sulla mia macchina di sviluppo di Windows ho tutti i tipi che non mi servono: SQL Server, Ruby ecc.) e se dovessi eliminare tutto ciò che non è necessario, il secondo metodo andrebbe bene.

Un'altra cosa che potresti fare è scaricare require alla fine dello script e codificarlo nel tuo file php.ini.

Davvero, però. Non penso che questo sarà un collo di bottiglia nelle prestazioni del tuo sistema. Usa ciò che è più facile per te.

Hai problemi di prestazioni su un sito che stai gestendo o è roba precauzionale? Posso capire perché vorresti preottimizzare (devo impedirmi di farlo) ma seriamente. Affronta questi problemi quando si presentano. Allora, quando sei nella posizione fortunata di avere un sito popolare che lo affronta. Alla fine della giornata, non è un incubo se devi sostituire qualche <=> s.

Preferisco di gran lunga il secondo modo: l'ho usato su un grande progetto PHP e mi è piaciuto molto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top