php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #9673 Relative paths in require(), require_once(), include(), include_once()
Submitted: 2001-03-10 16:45 UTC Modified: 2004-06-10 17:31 UTC
Votes:4
Avg. Score:4.0 ± 1.7
Reproduced:3 of 4 (75.0%)
Same Version:1 (33.3%)
Same OS:1 (33.3%)
From: vvo at geocities dot com Assigned:
Status: Not a bug Package: Scripting Engine problem
PHP Version: 4.3.2 OS: RedHat Linux
Private report: No CVE-ID:
 [2001-03-10 16:45 UTC] vvo at geocities dot com
Here is an example of how relative paths are currently resolved with cascading inclusions (command line is 'php /home/joe/a.php'):

File '/home/joe/a.php':
<?php
    # this include works as expected, 
    # locating '/home/joe/include/b.inc'
    include_once( 'include/b.inc' );
?>

File '/home/joe/include/b.inc':
<?php
    # this include will assume '/home/joe/c.inc', but
    # not '/home/joe/include/c.inc', as one may expect =(
    include_once( 'c.inc' );
?>

File '/home/joe/include/c.inc':
<?php
    echo 'hello';
?>

The way all four functions [require(), require_once(), include(), include_once()] resolve relative paths is counter-intuitive and unproductive with large directory structures, because some trickery is required to fix this problem. Not to mention that it hurts to see a different behavior from C-preprocessor #include directives.

If you don't believe me, then see comments to the include() function...

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-03-15 09:08 UTC] stas@php.net
First, PHP include() is in no way related or was promised to
relate to C preprocessor directives, so no wonder it behaves
differently.

Now, all relative pathes are resolved against the current
directory of the including script (which is the directory
where it's located). This is a known issue. Use
include_pathes in the meantime.
 [2001-03-15 10:09 UTC] vvo at geocities dot com
We are talking about all four functions here, not just include(). The resemblance of require() to the #include directive, as documented:

<quote>The require() statement replaces itself with the specified file, much like the C preprocessor's #include works.</quote>

If it's a "known issue", are there any plans to fix it?
Thanks.
 [2001-07-16 12:07 UTC] zeev@php.net
include() (and the other functions in its family) will now also look in the current executing file's directory, so this issue should be resolved.
 [2002-03-05 00:33 UTC] vvo at geocities dot com
I was happy for awhile, but eventually I noticed a problem with *some* relative paths (in version 4.1.1). 

Say, there is the main script 'test.php' and two other files, 'a.inc' and 'b.inc' (in subdirs):

File './test.php':
<?php
	require_once( 'include/a/a.inc' );
?>

File './include/a/a.inc':
<?php
	require_once( '../b.inc' );
	echo 'a.inc ';
?>

File './include/b.inc':
<?php
	echo 'b.inc ';
?>

Running 'test.php' fails with:

Fatal error: Failed opening required '../b.inc' (include_path='.:/usr/local/lib/php') 
in /home/geeba/include/a/a.inc on line 2

This isn't intended, is it?
Thank you!
 [2002-06-07 20:36 UTC] mfischer@php.net
Thank you for taking the time to report a problem with PHP.
Unfortunately your version of PHP is too old -- the problem
might already be fixed. Please download a new PHP
version from http://www.php.net/downloads.php

If you are able to reproduce the bug with one of the latest
versions of PHP, please change the PHP version on this bug report
to the version you tested and change the status back to "Open".
Again, thank you for your continued support of PHP.


 [2004-01-13 09:57 UTC] php at arantius dot cjb dot net
I'm sure I can get around this, but things really would be nice if this worked.  Situation is a very modular web site, with many files to be included, some class definitions, and some other fuctions.  Off of the root /, there is /classes and /plugins .  A file in /plugins is included from a file in /, and depends on a file in /classes.  In other words:

/main.php includes /plugin/driver.php
/plugin/driver.php includes /classes/Item.php

But, within /plugin/driver.php, the statement

require_once "../classes/Item.php" fails.
 [2004-03-18 17:51 UTC] schapht at drexel dot edu
I am using version 4.3.2, and I have this problem.  I 
also agree that the php include behavior hurts 
modularity.  I can't reuse classes w/o modifying the 
code to handle the new parent-script path.
Please tell me there's a fix for this.
 [2004-03-24 15:14 UTC] chunan at zingy dot com
I am also having problems with the include() function.  I  also agree that relative includes should always be relative to the current script.
 [2004-04-01 18:31 UTC] vvo at geocities dot com
Not clear to me why the issue status was changed to "Bogus". As far as I can tell multiple people have same issue.
 [2004-04-01 18:32 UTC] vvo at geocities dot com
setting version to 4.3.2
 [2004-04-02 16:03 UTC] chapwest at hotmail dot com
I have no idea what this means in regard to my sight.  Michael
 [2004-04-05 08:50 UTC] sniper@php.net
RTFM. There is no bug here.

 [2004-04-20 06:21 UTC] cameron at prolifique dot com
No, not necessarily a bug...just a very illogical and painful behavior for the include & require functions when using relative paths.

It's like having a compass that points north in relation to wherever you started your trip, not where you're standing now. Not much use. If you knew where you started, why would you need a compass? If a relative include path isn't relative to the script calling it, what's the use of a relative include path?

I never expected that the hardest part of moving from ASP to PHP would be include file references, but considering this behavior (still happening in 4.3.4), it appears to be.

Luckily, there appears to be a workaround:

[2 Sep 2003 8:48am CEST] mathieu dot messe at urssaf dot fr 

A workaround found at http://fr.php.net/manual/fr/function.include.php
is to use

require(dirname(__FILE__) . "\..\second.php");
 [2004-06-10 17:31 UTC] vvo at geocities dot com
That's ok, I gave up on PHP a long time ago. RTFPHPM yourself.
 [2004-07-01 16:30 UTC] php at mrvanes dot com
I too second that it would be logical to have the path relative to the _current_ file we're looking at, no matter how deep it is included in other files. Relativity makes absolute _no_ sense without this.
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Sun Apr 20 01:02:05 2014 UTC