Andreas Lindig: Wurzelverzwichnis auslesen

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

--
SELFFORUM - hier werden Sie geholfen,
auch in Fragen zu richtiges Deutsch
  1. 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

  2. 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';

  3. 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

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  4. 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

    --
    SELFFORUM - hier werden Sie geholfen,
    auch in Fragen zu richtiges Deutsch
    1. 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

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!