PHP Includes: Pfade richtig setzen

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo,

ich habe gerade ein Problem mit dem Includen.
Ich arbeite dank SVN auf diversen Systemen iMac, Windows, Macbook usw.
Nun passiert es mir öfter mal, das meine Pfade unterschiedlich sind.

Win:
c:\xampp\htdocs\index.php

Mac
/Applications/XAMPP/xamppfiles/htdocs/DevShop/index.php

Ich möchte nun aber nicht für jede Datei durch die Ordner hüpfen (../../../) sondern das irgendwie global definieren.

Das Problem stellt sich auch das meine "Config" nicht im Root Ordner liegt, sondern einen weitere im /config/, welches die von der index included wird.

Ich hoffe jemand versteht mein Problem oO
 
Du solltest immer relative Pfade statt absoluter nutzen. Du weißt nie, wie deine Zielumgebung aussieht. Du weißt nie, auf was für einer Maschine deine Seite mal laufen wird und wo sie auf der Maschine liegt.

Und außerdem gibts ja immer noch $_SERVER['DOCUMENT_ROOT']
 
Ganz einfach:

Code:
//Das in einer Datei reinmachen, die per SVN nicht berücksichtigt wird und auf jeden PC anpassen
define('LOCAL_DIR', 'Ordner_name');

$root_url = http://" . $_SERVER['HTTP_HOST']. "/" . LOCAL_DIR;
define('ROOT_URL', $root_url);
Und dann so andere Dateien einbinden:

Code:
<script src="<?php echo ROOT_URL; ?>js/login.js"></script>
//oder
include_once ROOT_URL. '../../includes/site_building.php';
 
Daaron schrieb:
Und außerdem gibts ja immer noch $_SERVER['DOCUMENT_ROOT']
Naja, aber was machst Du wenn ein Server so toll ist und aus der Variable so etwas zaubert,
-> /var/www/domain.de/

und auf einem anderen Server hast Du dann den letzten Slash nicht dabei?
Habe so etwas nämlich schon gehabt und erst einmal alle $_SERVER umbauen dürfen. Darum habe ich mir eine kleine Basis Config erstellt, die ungefähr so aussieht...
PHP:
<?php
 $cfg = array();
 $cfg['http'] = "http://www.domain.de";
 $cfg['root'] = "/var/www/domain.de";
?>
Natürlich muss man immer noch dafür sorgen, dass man bei einem Server-Umzug die richtige URL beim root eingegeben hat, aber so muss nur noch eine Variable umgeschrieben werden :)

Ich glaube die VB Foren Software und manche CMS machen es nach dem gleichen Prinzip.
Gruß, Domi
 
Es gibt ja z.B. auch noch den Parameter 'SCRIPT_FILENAME'

Aber meist ist der Aufbau doch eh
/ (webroot)
/ein-include-ordner/config.php
und dir kann egal sein, wo auf der Maschine dein Kram jetzt liegt.

Deine Basis-Konfiguration funktioniert übrigens nicht, wenn du wie hier denselben SVN-Checkout auf mehreren Maschinen nutzen willst, denn dann unterscheidet sich zumindest die config.php zwischen jeder Entwickler-Maschine und dem Live-System. Dann lieber etwas, bei dem der Server selbst bestimmt, wie der absolute Pfad aussieht. Das kann dann gern in einer Konstanten, z.B. BASEDIR, gespeichert werden.
 
Hm.. Okay, dass war mir nicht bewusst. Dann wäre es bei mir vielleicht besser, wenn ich meine Variable $cfg['root'] mit dem Inhalt von $_SERVER füttern lasse, dann verwende ich ja keinen selbst eingegebenen absoluten Pfad mehr :)

Oder wie hattest Du das mit "relativen" Pfaden vorgestellt.., ist der Gedanke etwa include("../bla/blubb.php"); gewesen?
 
Daaron schrieb:
Du solltest immer relative Pfade statt absoluter nutzen.
Klingt gut, würde aber trotzdem auf absolute Pfade setzen.
Code:
define( 'DIR_ROOT', __DIR__ );
// oder
define( 'DIR_ROOT', dirname( __FILE__ ) );
in die index.php (wenn alles über diese läuft, oder per defines.php o.ä. im script root) und schon ist die Sache gegessen.

Dann ist der Pfad immer korrekt gesetzt.
 
Die eigentliche Lösung des Problems wurde schon genannt, aber hier noch eine Anmerkung:

Domi83 schrieb:
und auf einem anderen Server hast Du dann den letzten Slash nicht dabei?
Andere Programmiersprachen haben dafür eine Funktion (bspw. path.join), die dir automatisch die Slashes richtig macht. Sowas kann man auch selbst schreiben. Nötig ist das in diesem Fall aber nicht wirklich, da du beliebig viele Slashes verwenden kannst:

/foo/bar ist das gleiche wie /foo//bar (und foo////////bar usw.), also ist es egal, ob irgendein Präfix mit Slash endet oder nicht, solange das Suffix mit einem Slash beginnt.
 
ich muss das thema leider nochmal hervor holen, weil ich gerade vor einem problem stelle.

im einsatz habe ich nun:
PHP:
define('DIR_ROOT',dirname(__FILE__));
das funktioniert für alle meine php-scripte wunderbar.
wenn ich aber ein template lade und dort die css datei laden will, funktioniert es nicht.

PHP:
define('DIR_FRONTEND_CSS', DIR_FRONTEND.'css/');

dabei entsteht:
PHP:
/Applications/XAMPP/xamppfiles/htdocs/DevListShop/template/default/css/

wenn ich das im code benutze, funktioniert es nicht, obwohl die url im terminal ok ist ...

HTML:
    <style type="text/css">
        @import url("<?=DIR_FRONTEND_CSS; ?>all.css");
    </style>


laut quellcode:
HTML:
 @import url("/Applications/XAMPP/xamppfiles/htdocs/DevListShop/template/default/css/all.css");

HTML:
benjamins-macbook-pro:default benny$ cat /Applications/XAMPP/xamppfiles/htdocs/DevListShop/template/default/css/all.css
p {
    font-size: 25px;
}

wie kann ich das lösen?
 
Ich bezweifel, dass der Pfad so vom Browser zu gebrauchen ist. Wohl eher wäre /DevListShop/template/default/css/all.css zu nutzen. Den absoluten kannst du nur in deinen Scripten nutzen, für den Client müsstest du absolute Pfade relativ zum htdocs nutzen.
 
Zuletzt bearbeitet:
Erstens das, und zweitens sollte @import() vermieden werden. Das verzögert das Parsing des Dokumentes unnötig (und teilweise wirklich stark). Siehe: https://developers.google.com/speed/docs/best-practices/rtt

Da du eh weißt, wo deine Stylesheets relativ zum Webroot (denn nur der zählt im Browser) liegen, gib die Pfade entsprechend als <link rel="stylesheet href="relativpfad" media="all"> an.
 
Zurück
Oben