32

Currently on my site I'm using statements like:

include 'head.php';
include '../head.php';
include '../../head.php';

depending on how many nested folders deep I am. I'm sure there is a better way to do this.

I'm convinced .htaccess is the solution, but I'm not sure how to go about implementing it. If I insert:

php_value include_path "public/html/root"

... I lose the rest of my paths (/usr/lib/php, etc). I naively tried:

php_value include_path $include_path . "(path)"

but of course this didn't work. How could I prepend or append a single path to this list with .htaccess?

zildjohn01
  • 11,339
  • 6
  • 52
  • 58

2 Answers2

28

Create in the sub-sub-directories a file .htaccess with the contents

php_value include_path '../../includes'

or whatever include_path is right for that directory.

Advantages:

  1. No ugly hack with multiple includes with different depth. Just include 'head.php'.
  2. No dependency on editing php.ini.
  3. No need to use set_include_path() before including.
  4. No dependency on including constants like include INCLUDE_PATH . 'head.php'.

Price to pay:

You litter your sub-sub-directories each with a file .htaccess.

nalply
  • 26,770
  • 15
  • 78
  • 101
  • 2
    I like it, and appreciate the writeup with clearly articulated benefit & cost. I dont like the littering, but I'm doing it. Thanks! :) – david van brink Sep 26 '13 at 04:43
  • 1
    I very much like this method because a) it decouples my application's configuration from my application's logic (no `set_include_path()` calls), yet my application's configuration remains within my application and b) it decouples my application's configuration from my application environment (no changes to `php.ini` or `httpd.conf` or whatever). Sure, you'll "suffer" from an extra read operation per directory per web request, but so what? A moderately-sized PHP app is going to have dozens or more PHP includes on each request anyway, unless it's deployed to prod via something like ScriptJoiner. – The Awnry Bear May 02 '14 at 17:47
  • This rule is not append but removes all previously defined include paths. But how to append new paths with .htaccess? – Ivan Z Oct 28 '20 at 08:51
  • Good question. I don't know. – nalply Oct 29 '20 at 15:58
24

If you can't edit the php.ini file itself, you could add

set_include_path(get_include_path() . PATH_SEPARATOR . $path_to_add);

before your include statements.

However if you find yourself having include or require troubles, it is probably a code smell. The best solution would be a good object-oriented design with a good __autoload function.

Otterfan
  • 751
  • 4
  • 7
  • Unfortunately I'm on a server with a lot of other sites right now... I don't want to put the path_to_add in every single file because it's something odd like /home/12345678/public_html... I'd just like to add the "public_html" to the include path in the simplest way possible. Doing a search and replace when the site gets transferred seems clunky. – zildjohn01 Jul 16 '09 at 03:24
  • Could you look up the current php `include_path` with `php_info()` or `get_include_path()` and then add php_value include_path "public/html/root:/first/old/path:/second/old/path" to your `.htaccess`. You'd only have to do it once. – Otterfan Jul 16 '09 at 03:35
  • True, but I was hoping for a more elegant solution. Hopefully they don't reconfigure the server any time soon. Anyways thanks for the help, this is probably the best it can get. – zildjohn01 Jul 16 '09 at 03:37