2010-10-17 17 views
22

Sto riscontrando problemi con i miei file include. Non riesco a capire come costruire i miei URL quando uso require_once ('somefile.php'). Se provo a utilizzare un file di inclusione in più di una posizione in cui le strutture di directory sono diverse, viene visualizzato un errore che non è possibile trovare il file di inclusione.PHP come trovare l'applicazione root?

In asp.net, per ottenere il percorso root dell'applicazione, posso usare ~/directory/file.aspx. La barra del primo colpo sa sempre che sto facendo riferimento al mio sito web root e trovo il file indipendentemente da dove viene la richiesta all'interno del mio sito web. Fa sempre riferimento alla radice e cerca il file da lì.

DOMANDA: Come posso ottenere il percorso root del mio sito? Come posso fare questo in modo da poter riutilizzare i miei file di inclusione da qualsiasi luogo all'interno del mio sito? Devo utilizzare percorsi assoluti nei miei URL?

Grazie!

+2

URL costruire non hanno nulla a che fare con require_once URL non è un file è cosa protocollo HTTP, non fileSystem –

+0

Quale versione di PHP stai usando e come appare la tua struttura di file system? – Petah

risposta

20

C'è $_SERVER['DOCUMENT_ROOT'] che dovrebbe avere il percorso di root per il tuo server web.

Modifica: Se si guardano i principali programmi di php. Quando si utilizza il programma di installazione, di solito si entra nel percorso completo della cartella dell'applicazione. Il programma di installazione lo inserirà in un file di configurazione che è incluso nell'intera applicazione. Un'opzione è usare un auto prepend file per impostare la variabile. un'altra opzione è solo il include_once() il file di configurazione in ogni pagina che ti serve. L'ultima opzione che suggerirei è di scrivere l'applicazione usando bootstrapping, che è dove si incanalano tutte le richieste attraverso un file (di solito con url_rewrite). Ciò consente di impostare/includere facilmente variabili di configurazione in un punto e renderle disponibili in tutti gli script.

+0

Nella mia macchina di sviluppo usa ng WampServer Ottengo C:/wamp/www/quando uso $ _SERVER ['DOCUMENT_ROOT']. Il mio sito tuttavia si trova in C:/wamp/www/mysite /. Se il mio sito è stato ospitato su un server live come un host condiviso, cosa otterrei usando $ _SERVER ['DOCUMENT_ROOT']? –

+0

mysite è un host virtuale? – koen

+1

Questo accade perché la radice dell'applicazione reale è C:/wamp/www e si ospita il codice in una sottodirectory di questo. Potresti voler cambiare la root del documento per questo progetto o creare una variabile (const MY_APP_ROOT = ... –

-2

Prova questo:

$_SERVER['DOCUMENT_ROOT'] 
+0

No: l'OP cerca l'URL di base, non il percorso del file –

+1

@Scott Di fatto, l'unico utilizzo di questa variabile è il caricamento dei file di inclusione –

+0

Corretto: funziona bene, qui – winwaed

-1

si dovrebbe usare il costruito nel costanti magici per trovare i file. __FILE__ e __DIR__. Se siete su PHP < 5.3 dovreste usare dirname(__FILE__)

E.g.

require_once __DIR__.'/../../include_me.php'; 

$_SERVER['DOCUMENT_ROOT'] non è sempre garantito per restituire ciò che ci si aspetterebbe.

+0

questo non funzionerà nelle sottodirectory –

+0

Perché non dovrebbe funzionare in sotto-dir? 'require_once __DIR __. '/ i/am/a/sub/dir.php' – Petah

+0

Sfortunatamente nessuna di queste soluzioni sembra funzionare. $ _SERVER ['DOCUMENT_ROOT'] è il più vicino alle soluzioni ma non carica i file include. –

-1

Definirlo in un file di configurazione da qualche parte.

Supponendo che si sta utilizzando uno stile di MVC in cui tutto viene instradato attraverso un unico index.php poi

realpath('.'); 

vi mostrerà il percorso della directory di lavoro corrente (indice vale a dire dove.php è)

Così allora si può definire questo come

define('PROJECT_ROOT', realpath('.')); 

Se non è MVC e avete bisogno di lavorare per i file in sottocartelle allora si può codice solo difficile in un file di configurazione

define('PROJECT_ROOT', 'C:/wamp/www/mysite'); 

Quindi quando si include qualcosa che si può fare;

include PROJECT_ROOT . '/path/to/include.php'; 
-1

Si potrebbe Alternativly impostare la directory di base nel file .htaccess

SetEnv BASE_PATH C:/wamp/www/mysite/ 

Poi in PHP è possibile fare riferimento con $_SERVER['BASE_PATH']

+0

Perché tutto l'odio? – Petah

8

Io di solito negozio config.php file nella directory ROOT, e in config.php scrivo:

define('ROOT_DIR', __DIR__);

E quindi utilizzare solo ROOT_DIR costante in tutti gli altri script. Utilizzando $_SERVER['DOCUMENT_ROOT'] non è molto buona perché:

  • non sempre corrispondenti ROOT_DIR
  • Questa variabile non è disponibile in CGI modalità (ex se si esegue i vostri script da cron)
+4

per utilizzare costante ROOT_DIR in tutti gli altri script, devi includere un file che lo contiene in tutti gli altri script. Quindi, lo stesso problema di nuovo. –

+1

Sì, ma almeno puoi semplicemente usare: include (ROOT_DIR. '/ Known/path/to/file.php'); Invece di usare qualcosa come: $ ROOT = '../../../'; (che deve cambiare in ogni sottodirectory), ma poi devi preoccuparti di globalizzare $ ROOT tutto il tempo. – AVProgrammer

+0

Penso che sia un buon modo di $ _Server array – HAROONMIND

0

È bello poter utilizzare lo stesso codice nella parte superiore di ogni script e sapere che la pagina verrà caricata correttamente, anche se ci si trova in una sottodirectory. Io uso questo, che si basa su di voi sapere che cosa directory principale si chiama (in genere, 'htdocs' o 'public_html':

defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html'); 

Con SITEROOT definito in modo coerente, si può quindi accedere a un file di configurazione e/o componenti della pagina senza adattare i percorsi su una sceneggiatura-by-script base ad esempio per un file di configurazione memorizzato fuori della vostra cartella principale:..

require_once SITEROOT . "/../config.php";