It's very odd,has anyone ever sum up with a conclusion yet?
Sometimes it checks the directory of the included file,too.
But sometimes not.
D:\test\1.php
<?php
include('sub\2.php');
D:\test\2.php
<?php
include('3.php');
Where 3.php
is in the same dir as 2.php
.
The above works,but why?The current directory should be D:\test
,but it can still find 3.php,which is in D:\test\sub
More story(final)
About a year ago I met this problem,and then I ended up fixed it with the hardcoding like below:
Common.php:
if (file_exists("../../../Common/PHP/Config.inc"))
include('../../../Common/PHP/Config.inc');
if (file_exists("../../Common/PHP/Config.inc"))
include('../../Common/PHP/Config.inc');
if (file_exists("../Common/PHP/Config.inc"))
include('../Common/PHP/Config.inc');
if (file_exists("Common/PHP/Config.inc"))
include('Common/PHP/Config.inc');
Where Config.inc
is in the same directory as Common.php
If you take a look at the source code for php in main/fopen_wrappers.c you will find
/* check in calling scripts' current working directory as a fall back case
*/
if (zend_is_executing(TSRMLS_C)) {
char *exec_fname = zend_get_executed_filename(TSRMLS_C);
int exec_fname_length = strlen(exec_fname);
while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length]));
if (exec_fname && exec_fname[0] != '[' &&
exec_fname_length > 0 &&
exec_fname_length + 1 + filename_length + 1 < MAXPATHLEN) {
memcpy(trypath, exec_fname, exec_fname_length + 1);
memcpy(trypath+exec_fname_length + 1, filename, filename_length+1);
actual_path = trypath;
This seems to be executed unconditionally and therefore will always make a file in the same path as the including/file-opening script accessible ...as the last choice after all possibilities specified in include_path. And only if you do not define a relative or absolute path in the include().
It checks in the current path, and the directories listed in include_path.
You can run a phpinfo()
to see your include path.
Sometimes directory of the included file being current working directory
and sometimes not
Current directory can be checked with getcwd()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With