2010-02-21 7 views
7

Um URLs in versionsgesteuerten Projekten zu verwenden, habe ich $ _SERVER ['DOCUMENT_ROOT'] verwendet. Das Problem ist, ich entwickle Projekte in einem Ordner, also bekomme ich folgendes:Wie kann ich DOCUMENT_ROOT steuern, um auf localhost und Live-Server zu arbeiten?

$ _SERVER ['DOCUMENT_ROOT']. '/folder/path/to/file.php'

Wenn ich online gehen, ich in der Regel wollen einfach folgendes:

$ _SERVER [ 'DOCUMENT_ROOT']. '/path/to/file.php'

Ich weiß, es gibt größere Probleme in der Welt, als diesen Ordnernamen entfernen und hinzufügen zu müssen, aber gibt es eine Möglichkeit, die ich leicht automatisieren kann? Kann ich meinen Dokumentenstammordner lokal so einstellen, dass er den Ordner enthält, in dem ich arbeite? Habe ich ein grundsätzliches Missverständnis darüber, wie die Dinge funktionieren? Irgendwie neu in diesem Zeug und darauf aus, so viel wie möglich zu lernen und wirklich das "Warum" zu finden.

Vielen Dank!

Antwort

10

Anstatt $_SERVER['DOCUMENT_ROOT'] zu verwenden, warum nicht eine Konstante deklarieren, die immer die Wurzel Ihrer Webanwendung enthält?

<?php 
define('ABSPATH', dirname(__FILE__)); 

Fügen Sie den folgenden Code in eine Datei im Stammordner Ihrer Anwendung ein und schließen Sie sie bei jedem Laden der Seite ein.

Dann können Sie einfach immer $path = ABSPATH . '/path/to/file.php'; tun, unabhängig davon, ob Ihre lokale Kopie in einem Unterverzeichnis folder ist oder nicht.


Wenn Ihre Anwendung bereits eine Datei hat, die auf jeder Seite Last enthalten ist, können Sie einfach den Code in dieser Datei fallen und es wird funktionieren.

Beachten Sie, dass Sie möglicherweise zusätzliche dirname() Aufrufe abhängig davon hinzufügen müssen, wo sich diese Datei befindet. Fügen Sie für jedes Verzeichnis, das Sie vom Stamm Ihrer Webanwendung übergeben, eine hinzu.

Zum Beispiel, wenn Ihre Webapp in /webapp/ befindet und Ihre "global umfassen" wird in /webapp/includes/framework/init.php befindet, dann wird der obige Code muss als solche modifiziert werden:

define('ABSPATH', dirname(dirname(dirname(__FILE__)))); 

dh .: 2 zusätzliche dirname() Anrufe aufgrund von zwei zusätzlichen Ordner aus der Wurzel webapp (includes/framework)


Klärungs

Der obige Code ist in einer Datei und nur in Ihrer Webanwendung enthalten. Diese Datei muss bei jedem Laden der Seite enthalten sein.

Wenn Sie bereits eine Datei haben, die vor der Verarbeitung enthalten ist (z. B. eine Konfigurationsdatei oder andere), können Sie diesen Code kopieren und in diese Datei einfügen.

Die Anzahl der Aufrufe von dirname() hängt davon ab, wie tief die Datei, die Sie kopiert und eingefügt haben, in Bezug auf das Stammverzeichnis Ihrer Webanwendung ist. Nehmen Sie für die obigen Beispiele an, dass der Stamm Ihrer Webanwendung durch ~ dargestellt wird.Wenn Sie Ihren Code in ~/abspath.php kopieren, dann brauchen Sie einen dirname() Anruf. Wenn Sie meinen Code in ~/includes/abspath.php kopieren, dann benötigen Sie zwei dirname() Aufrufe.

Wenn Sie meinen Code in ~/includes/config/abspath.php kopieren, dann benötigen Sie drei dirname() Anrufe. Sagen wir einfach, das ist der endgültige Ort.

In ~/index.php, müssen Sie die folgenden:

<?php 
require_once('includes/config/abspath.php'); 

und Sie haben Zugriff auf ABSPATH.

In ~/dir/someOtherPage.php Sie wie folgt vor:

<?php 
require_once('../includes/config/abspath.php'); 

und Sie haben Zugriff auf ABSPATH.

Deshalb sage ich, dass, wenn Sie bereits eine Datei haben, die auf jeder Seite geladen wird, es einfacher ist, nur den obigen Code darin fallen zu lassen. Stellen Sie nur sicher, dass Sie die Anzahl der Aufrufe von dirname() entsprechend ändern. Auch hier ist dieser Code nur in EINER Datei enthalten.

+0

Alles klar Andrew, Ihre Methode ist am Anfang etwas schwerer zu verstehen. Lass mich überprüfen, dass ich es verstehe: Jeder dirname geht eine Ebene vom Speicherort der enthaltenen Datei? Wenn also die eingeschlossene Datei an dem Ort ist, an den ich suchen möchte (myLoc), ist es nur ein dirname(), aber wenn er in myLoc/sub1/sub2/sub3 ist, würde ich dirname (dirname (dirname (dirname (__ FILE__))))? Also im Wesentlichen die Anzahl der dirnames erlaubt mir, immer von dem Ort zu starten, ich möchte für den ABSPATH beginnen? –

+0

Das hat super funktioniert; Vielen Dank für eine perfekte Lösung, Andrew. –

+0

Großartig. Ich habe es in eine konstante Datei eingefügt, die in meiner Kopfzeile benötigt wird, die auf jeder Seite enthalten ist. Funktioniert großartig auf Dev, und ich erwarte, dass es perfekt auf Produktion funktioniert; es bis dahin zu svn. –

1

erklären unter der Linie in einem der root Datei (index.php)

$_SESSION["uploads_base_url"]=dirname(__FILE__); 

und Sie können diese in jeder Datei verwenden, in denen Uploads benötigt.

echo $uploads_base_url=$_SESSION["uploads_base_url"];