How to require_once from different directories?

marvin picture marvin · Feb 8, 2013 · Viewed 8.6k times · Source

I am trying to require my "library" files from php files in different folders, but it gives errors when trying to access them from a subfolder. For example I have such a directory:

+ home    
- file1.php

 ++ subfolder
  - file2.php

 ++ libraries
  - code_generator.php
  - database_library.php

code_generator.php also depends on the other library:

(LINE 25) require_once(realpath("./libraries/database_library.php"));
//this works fine when called from file1.php, but not from file2.php

I try to call code_generator from ./subfolder/file2.php like:

chmod("../libraries/codegenerator.php", 0777);  // for the error at the end of this question
require_once("../libraries/code_generator.php");

When I run file2.php, it yields 2 errors:

**Warning**: require_once(C:\xampp\htdocs\home\subfolder): failed to open stream: Permission denied in C:\xampp\htdocs\home\libraries\code_generator.php on line 25

**Fatal error**: require_once(): Failed opening required '' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\home\libraries\code_generator.php on line 25

*line 25 is require_once(realpath("./libraries/database_library.php"));

Answer

AD7six picture AD7six · Feb 8, 2013

The file does not exist.

The error message reads:

Warning: require_once(C:\xampp\htdocs\home\subfolder): failed to open stream:

And:

Failed opening required ''

Error messages never lie (well, almost never), therefore you are calling:

require_once('');

Realpath returns false for missing files

Realpath will return false if you pass it a path to a file that doesn't exist:

$return = realpath('this/doesnt/exist.foo'); // $return is false

Therefore, the argument passed to realpath doesn't refer to a file, which is the reason the path doesn't work.

Don't over use realpath

If you remove the use of realpath, you'll find that the error message is probably obvious. At a guess you're trying to include C:\xampp\htdocs\home\subfolder\libraries\database_library.php - because there is a missing . in this:

line 25 is require_once(realpath("./libraries/database_library.php"));

If instead you just define a root path:

define('ROOT', 'C:\xampp\htdocs\home\\');

Then you can use this constant with absolute confidence that these sort of problems wont occur:

require_once(ROOT . "libraries/database_library.php");

And if you do get the path wrong, the error message will make it obvious what the problem is.