tags:

views:

39

answers:

3

Hi,

I have to deal with complex directories hierarchy, and I am facing the common trouble of include path with PHP.

I have searched the web but I haven't found anything that fit my needs.


For instance, I was using a simple directory hierarchy that never fail: no php script in the site root, only one level of subdirectory, all php script in this sublevel. To include a php file, I was simply using relative path, always starting with '../' just like in this example:

include( '../my_subdirectory/my_script.php' ) ;

This way, I can be sure to locate the file I want...

But there is some drawback:

  • I can't have more than one level of subdirectory (reason: when a file include a file that include another file, the path used to include the third file is not relative to the path of second file file, but relative to the path of the very first file).
  • Coming from a C++ background (using handmade makefile), I have always thought it was a dirty way to do it

So I want a way to include file directly from the site root (not the $_SERVER['DOCUMENT_ROOT'] because I may have independant website into subdirectory of this document_root).

I want it to be:

  • centralized in only one file
  • portable from a server to another without any change (if possible)
  • keep php's include simple and elegant, no complex string concat, this should work this way: "include('directory_a/directory_b/my_php_script.php')"

Using a .htaccess that contains:

php_value include_path "/var/www/my_website/" 

... do it well except that the path is hardcoded into the .htaccess, annoying for some reason: in my case, I have prod, dev and testing version of the website, and the .htaccess is versionned (it contains many others things). If possible, I want an .htaccess that work everywhere. Something that set the include_path to the path of this current .htaccess would be fine.

So... What is the best practice, dealing with include() and complex directory hierarchy in PHP ?

+2  A: 

A good way is to use an absolute path like this :

Php < 5.3 :

include(dirname(__FILE__) . '/yourfile.php');

Php 5.3 :

include(__DIR__. '/yourfile.php');
Spilarix
Thanks for the reply, this way it avoids trouble when a file include a file that include another file... But actually, the path '/yourfile.php' is still relative to the current file, not relative to the site root as I want.
Cedric
Just merge the previous code with a relative path like '/../yourfile.php' to join the root_path (I hope you can anticipate the hierarchy level)
Spilarix
A: 

The __FILE__ constant will always point to the absolute path to the current file.

If you do this in a script in your site root:

define("ROOT_DIRECTORY", dirname(__FILE__));

and include it in every script, you can easily do relative includes:

include ROOT_DIRECTORY."/dir1/dir2/dir3/index.php";  

if what you are including are PHP class structures, you may also want to look into Autoloading which is a great feature.

Pekka
Thanks for the reply, I will think about it... For instance I still prefer the .htaccess way (despite the fact I need to hardcode path into it).
Cedric
@Cedric if you want portability, this is the way to go
Pekka
A: 

I think the best way to handle this, is to set an "SetEnv directive" in your vhost or httpd.conf for each environment.

httpd.conf:

SetEnv INCLUDES_DIR /var/www/my_website/

In every PHP file, you can use the following $_SERVER variable

include_once($_SERVER['INCLUDES_DIR'].'/my_subdirectory/my_script.php');
Bas van Dorst
Can't do that in the httpd.conf cause I have many different website on the same server. And it's more or less like writing 'php_value include_path "/var/www/my_website/" ' in an .htaccess...
Cedric