How do you get PHP, Symlinks and __FILE__ to work together nicely? How do you get PHP, Symlinks and __FILE__ to work together nicely? linux linux

How do you get PHP, Symlinks and __FILE__ to work together nicely?


The problem that I see with your code is that __FILE__ resolves symlinks automatically.

From the PHP Manual on Magic Constants

... Since PHP 4.0.2, __FILE__ always contains an absolute path with symlinks resolved ...

You can try using $_SERVER["SCRIPT_FILENAME"] instead.

$root = realpath(dirname(dirname(dirname(dirname($_SERVER["SCRIPT_FILENAME"])))));  if (file_exists($root.'/wp-load.php')) {      // WP 2.6      require_once($root.'/wp-load.php');  }

Note that I added the realpath() function to the root directory. Depending on your setup, you may or may not need it.

EDIT: Use $_SERVER["SCRIPT_FILENAME"] instead of $_SERVER["PHP_SELF"] for the file system path.


Here is the solution to that issue: https://github.com/logical-and/symlink-detective

$root = dirname(dirname(dirname(dirname(__FILE__))));  if (file_exists(SymlinkDetective::detectPath($root.'/wp-load.php'))) {      // WP 2.6      require_once(SymlinkDetective::detectPath($root.'/wp-load.php'));  }

or you can try that

try {  $root = dirname(dirname(dirname(dirname(__FILE__))));  require_once SymlinkDetective::detectPath($root.'/wp-load.php', '',     false /* this would throw an exception if file doesn't exists */);}catch (Exception $e) {  // nothing to do if file doesn't exists}


You can use this code snippet to get a path where symlinks are not resolved.If you don't have bash available, there's probably a different command you can use, but it works on linux enviroments.

I do think it's a malpractice that php resolves symlinks in FILE, since there's no way to get the path with symlinks. Otherwise we could easily get it using realpath.

Oh well.

<?php$output = array();exec('pwd', &$output);define('__LINK__', $output[0].substr(__FILE__, strpos(__FILE__, DIRECTORY_SEPARATOR)));?>