Wurzelverzwichnis auslesen
Andreas Lindig
- php
0 Christian Seiler0 Feng0 Cybaer0 Andreas Lindig0 Cybaer
Hallo zusammen,
gibt es eigentlich eine Möglichkeit, mit PHP das Wurzelverzwichnis meines Projekts zu erkennen? Also ich habe z.B.:
Domain
|
+-- A
| |
| +-> Unterverzeichnisse
|
+-- B
|
+-> Unterverzeichnisse
Mein Projekt liegt in A. In A liegt ein zentrales Script, das in allen Scripten der Unterverzeichnisse eingebunden ist. In dieser Zentrale soll es eine Variable $projekt_wurzel geben, die z.B. so lautet: http://domain/A/. so soll sie auch lauten, wenn diese Datei in irgendeinem Unterverzeichnis eingebunden ist. Dort wird diese Zentrale dann ja so interpretiert, als würde sie DORT liegen. Wenn ich das ganze Projekt jetzt nach B verschiebe, soll in der Variablen automatisch http://domain/B/ stehen. Geht das?
Gruß, Andreas
Hallo Andreas,
Mein Projekt liegt in A. In A liegt ein zentrales Script, das in allen Scripten der Unterverzeichnisse eingebunden ist. In dieser Zentrale soll es eine Variable $projekt_wurzel geben, die z.B. so lautet: http://domain/A/. so soll sie auch lauten, wenn diese Datei in irgendeinem Unterverzeichnis eingebunden ist. Dort wird diese Zentrale dann ja so interpretiert, als würde sie DORT liegen. Wenn ich das ganze Projekt jetzt nach B verschiebe, soll in der Variablen automatisch http://domain/B/ stehen. Geht das?
Naja, den Teil mit dem http://host kriegst Du leicht raus:
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$https = true;
$projekt_wurzel = 'https://';
} else {
$https = false;
$projekt_wurzel = 'http://';
}
if (isset($_SERVER['HTTP_HOST'])) {
$projekt_wurzel .= $_SERVER['HTTP_HOST'];
} else {
$projekt_wurzel .= $_SERVER['SERVER_ADDR'];
if (isset($_SERVER['SERVER_PORT']) &&
((!$https && $_SERVER['SERVER_PORT'] != '80') ||
($https && $_SERVER['SERVER_PORT'] != '443'))) {
$projekt_wurzel .= ':' . $_SERVER['SERVER_PORT'];
}
$projekt_wurzel;
}
Das /A/ und das /B/ ist etwas schwieriger. Wenn alle Scripte des Projekts direkt aufgerufen werden, dann dürfte folgendes reichen:
$projekt_wurzel .= dirname($_SERVER['PHP_SELF']);
if (substr($projekt_wurzel, -1) != '/') $projekt_wurzel .= '/';
Wenn es außerdem noch verschiedene Unterverzeichnisse gibt, dann musst Du irgendwie schauen, woher Du aufgerufen wirst und aus dirname($_SERVER['PHP_SELF']) die Unterverzeichnisse am Ende des Strings, die definitiv zu Deinem Projekt gehören, rausschmeißen. Eine Möglichkeit wäre z.B., dass das PHP-Script vor dem Include der Datei, die den obigen Code enthält ein
define('PROJEKT_SUBLEVEL', 1);
include_once '...';
macht. Das include nutzt dann die Konstante PROJEKT_SUBLEVEL und fügt dann mittels str_repeat so viele '../' an $projekt_wurzel an. Wenn PROJEKT_SUBLEVEL würdest Du auf 0 setzen wenn das Script direkt im Projektverzeichnis liegt, auf 1 für die erste Unterverzeichnisebene usw.
Alternativ kannst Du natürlich statt dem Anfügen von lauter '../' Teilpfade aus dem String von hinten rausschmeißen - ist allerdings etwas komplizierter.
Viele Grüße,
Christian
Angenommen, daß Deine "Zentrale.php" immer nur ein Directory "unterhalb der Domain" liegt, dann sollte das hier auch gehen:
// __FILE__ enthält den Namen des momentan ausgeführten Scripts (auch bei Includes) zB "c:\webroot\a\zentrale.php"
// Pathinfo bezieht dann nur den Pfad ( also "c:\webroot\a" )
$script_dirname = pathinfo( __FILE__, PATHINFO_DIRNAME );
// für Windows-Rechner die Slashes drehen ( das wird also zu "c:/webroot/a"
$script_dirname = str_replace('\', '/', $script_dirname);
// das Unterverzeichnis heraussuchen ( also "/a" )
$script_dirname = substr($script_dirname, - ( strlen ( $script_dirname ) - strrpos( $script_dirname, '/' ) ) );
// und eine Definition erstellen, weil hübscher
define ( 'ZENTRALER_INCLUDE_PATH', $script_dirname );
// Danach sollte sowas funktionieren
include '.' . ZENTRALER_INCLUDE_PATH . '/mein_file.php';
Hi,
Wenn ich das ganze Projekt jetzt nach B verschiebe, soll in der Variablen automatisch http://domain/B/ stehen. Geht das?
$projekt_wurzel='http://domain/'.basename(dirname(__FILE__)).'/';
Gruß, Cybaer
Hallo,
hehe, das wird ja immer einfacher ,-) Ich danke allen Helfern. Villeicht noch ein Wettbewerb? Sagen wir... wer es unter 20 Zeichen schafft, bekommt den Preis ;-)
Gruß, Andreas
Hi,
Hallo,
hehe, das wird ja immer einfacher ,-) Ich danke allen Helfern. Villeicht noch ein Wettbewerb? Sagen wir... wer es unter 20 Zeichen schafft, bekommt den Preis ;-)
$pw=url(dirname(__FILE__,-1)).'/';
Allerdings müßtest Du dafür noch meine PHP-Basisbibliothek includen. :)
Dafür wäre das Ergebnis dann auch wollmilcheiersaulegend (im Sinne von Christians Vorschlag). ;-)
Gruß, Cybaer