Re[2]: Document root, preferred way to find it???

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Saturday, March 5, 2005, 5:47:07 AM, you wrote:
LG> Hello Richard,

LG> Friday, March 4, 2005, 11:41:29 AM, you wrote:
R>> http://php.net/set_include_path


LG> Ok... Maybe I should put all this together in one e-mail so that all
LG> the issues can be looked at...

LG> The problem:

LG> Finding a reliable method to include files, keeping in mind the
LG> following:

LG> 1. The site could be moved to a completely new host which could be of
LG>    a different OS, and/or web server software, and could either be the
LG>    one and only site on that host (dedicated server), or could be a
LG>    virtual host (shared server).

LG> 2. The site could remain on the same host but is required to move to a
LG>    new path. i.e. from htdocs/mysite to htdocs/mynewsite

LG> 3. The web host may or may not allow the use of .htaccess (Some Sambar
LG>    configurations for example).

LG> 4. The method used would not affect any other virtual hosts. Meaning,
LG>    the method used must be independent for each virtual host.

LG> 5. The method used would not utilize a folder where other virtual
LG>    hosts could gain access to the included file (php.ini
LG>    include_path).

LG> 6. The method (and this is the important one IMHO) would not require
LG>    editing "x" number of pages in a site to change some static path
LG>    that was set on each page.

LG> 7. The method used would not require a dedicated "include" file in
LG>    every single folder of the site that could be included because it's
LG>    in the same folder as the page needing it, because those would all
LG>    have to be edited to fix the path if condition 1 or 2 was met.


LG> Previously proposed solutions:

LG> 1. PHP.ini include_path
LG>    This affects all virtual hosts and would require administrative
LG>    overhead to prevent the owners of each virtual host from gaining
LG>    access to other virtual host's include files. I suppose you could
LG>    set it to something like: include_path="/php/includes" and have a
LG>    separate subfolder under that for each virtual host. But since that
LG>    folder is outside the web folder, there would have to be some
LG>    mechanism (additional FTP account) for each person to gain access
LG>    to their own include folder to add/edit/delete files in that
LG>    folder. Then if the site is moved and they aren't using an
LG>    include_path, you have to fix all your pages.

LG> 2. set_include_path
LG>    This means if your site moves, you must edit "x" number of pages in
LG>    the site to correct the path.

LG> 3. An include file in every directory to set the include path.
LG>    You'd have to edit "x" number of these files to correct the path if
LG>    the site moves. This would be much less work than the previous
LG>    item, but it could be a lot of work on very big sites where you
LG>    don't have shell accounts to do some scripted find/replace with.

LG> 4. Use the full URL to the file in the include statement.
LG>    See item 2.

LG> 5. $_SERVER["DOCUMENT_ROOT"] and $_SERVER['PATH_TRANSLATED']
LG>    Not always available or incorrect see
LG>    mid:1778675148.20050303102623@xxxxxxxxxx


LG> I may have missed some things, and if I've misunderstood how something
LG> should work, then please let me know. I'm just looking for a more or
LG> less foolproof method which doesn't require fixing code if the site is
LG> moved. The closest I can come to it is the function I wrote but is a
LG> pain because you have to put it in every page where you need an
LG> included file. Granted, you only have to do it once, and then you're
LG> done and a site move wont affect it, but it's still kludgy if you ask
LG> me.

LG> *******************
LG> <?php
LG> function dynRoot() 
LG> { 
LG>   $levels = substr_count($_SERVER['PHP_SELF'],"/"); 

LG>   for ($i=0; $i < $levels - 1; $i++) 
LG>   { 
LG>     $relativeDir .= "../"; 
LG>   } 

LG>   return $relativeDir; 
LG> }    
?>>
LG> *******************

LG> and then calling it as such:

LG> include(dynRoot() . 'includes/db_connect.php');


LG> I've had to move client sites between Sambar, Apache, IIS and Windows,
LG> Linux. Most times I've had to go in and fix include paths because one
LG> of the above solutions were originally used and wasn't viable on the
LG> new host.

LG> Thanks.
   

LG> -- 
LG> Leif (TB lists moderator and fellow end user).

LG> Using The Bat! 3.0.2.3 Rush under Windows XP 5.1
LG> Build 2600 Service Pack 2 on a Pentium 4 2GHz with 512MB


This will set the include path just before the document root:

if(isset($_SERVER["SCRIPT_FILENAME"])){
        $root = $_SERVER['SCRIPT_FILENAME'];
        //echo "Root: $root<br>";
        
        $script = $_SERVER['SCRIPT_NAME'];
        $document_root = str_replace($script,'',$root);
        //echo "Document root: $document_root<br>";
        
        $base = basename($document_root);
        //echo "Base: $base<br>";
        
        $include = str_replace($base,'include',$document_root);
        //echo "Include: $include<br>";
        
        $os = strtolower(PHP_OS);
        //echo "OS: $os<br>";

        $lk = ':';
        $org_include = ini_get("include_path");
        if(preg_match('/^win/i',$os))   $lk = ';';
        
        ini_set("include_path",$include.$lk.$org_include);
        //echo "Include: ".ini_get("include_path")."<br>";
}

-- 
regards,
Tom

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux