realpath

(PHP 4, PHP 5)

realpathВозвращает канонизированный абсолютный путь к файлу

Описание

string realpath ( string $path )

realpath() раскрывает все символические ссылки, переходы типа '/./', '/../' и лишние символы '/' в пути path, возвращая канонизированный абсолютный путь к файлу.

Список параметров

path

Проверяемый путь.

Замечание:

Несмотря на то, что путь должен быть указан, переданное значение может быть пустой строкой или NULL. В этих случаях оно будет интерпретировано в качестве текущей директории.

Возвращаемые значения

В случае успеха возвращает канонизированный абсолютный путь. Результирующий путь не содержит символических ссылок и компонентов наподобие '/./' или '/../'.

realpath() возвращает FALSE при неудаче, например если файл не существует.

Замечание:

Запускаемый скрипт должен иметь права запуска на всех директориях в проверяемой иерархии, иначе realpath() вернет FALSE.

Замечание: Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.

Список изменений

Версия Описание
5.3.0 До этого релиза realpath() не терпела неудачу на системах *BSD в случае отсутствия лишь последнего компонента пути path. Теперь realpath() не срабатывает также и в этом случае.
5.0.0 До этой версии при передаче пустой строки или NULL в path realpath() возвращала имя директории, вызываемого скрипта.

Примеры

Пример #1 Пример использования функции realpath()

<?php
chdir
('/var/www/');
echo 
realpath('./../../etc/passwd');
?>

Результат выполнения данного примера:

/etc/passwd

Пример #2 realpath() на Windows

На Windows realpath() изменит пути стиля Unix на стиль Windows.

<?php
echo realpath('/windows/system32');
?>

Результат выполнения данного примера:

C:\WINDOWS\System32

Смотрите также

  • basename() - Возвращает последний компонент имени из указанного пути
  • dirname() - Возвращает имя родительского каталога из указанного пути
  • pathinfo() - Возвращает информацию о пути к файлу

Коментарии

mkdir (and realpath) did not work because i'd used virtual() function to replace server side include in my file.
And i've just seen that virtual() function changes the current directory ... that's why !

jerome ;)
2000-08-28 15:03:27
http://php5.kiev.ua/manual/ru/function.realpath.html
realpath() seems to be equivalent to ASP's Server.MapPath.  On my Win2k box I have successfully used realpath() to give me the full path for a file outside of the document_root.  This will be very useful in conjunction with is_dir and/or is_file, which require a full path.
2001-07-05 18:38:13
http://php5.kiev.ua/manual/ru/function.realpath.html
Sometimes you may need to refer to the absolute path of a file in your website instead of a relative path, but the realpath() function returns the path relative to the server's filesystem, not a path relative to your website root directory. 

For example, realpath() may return something like this:

/home/yoursite/public_html/dir1/file.ext

You can't use this in an HTML document, because the web server will not find the file. To do so, you can use:

<?php

function htmlpath($relative_path) {
   
$realpath=realpath($relative_path);
   
$htmlpath=str_replace($_SERVER['DOCUMENT_ROOT'],'',$realpath);
    return 
$htmlpath;
}

echo 
'<img src="',htmlpath('../../relative/path/to/file.ext'),'" border=1>'

?>

It will return something like:

<img src="/dir1/relative/path/to/file.ext" border=1>
2004-12-20 15:43:27
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
This function is also nice to test for security-breaches. You can forbid the script to access files below a certain directory to prevent "../../../etc/shadow" and similar attacks:

<?php

// declare the basic directory for security reasons
// Please do NOT attach a "/"-suffix !
$basedir '/var/www/cgi-bin/scriptfolder';

// compare the entered path with the basedir
$path_parts pathinfo($_REQUEST['file_to_get']);
if (
realpath($path_parts['dirname']) != $basedir) {
   
/* appropriate action against crack-attempt*/
   
die ('coding good - h4x1ng bad!');
}

?>

The url "script.php?file_to_get=../../../etc/shadow" will now result in an error.
2005-06-08 13:44:51
http://php5.kiev.ua/manual/ru/function.realpath.html
You have a realpath.
Now you want a htmlpath.

First Suggestion:
<?php

function htmlpath($relative_path) {
   
$realpath=realpath($relative_path);
   
$htmlpath=str_replace($_SERVER['DOCUMENT_ROOT'],'',$realpath);
   return 
$htmlpath;
}
?>

But this does not work on some servers.

Second Suggestion:

<?php

function htmlpath($realpath) {
   
$i substr_count($_ENV["SCRIPT_URL"],'/')."<br>";
   
$baserealpath=realpath(str_repeat('../',$i-1));
   
$htmlpath=str_replace($baserealpath,'',$realpath);
   return 
$htmlpath;
}

?>
2005-07-20 11:55:45
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Here's a function to canonicalize a URL containing relative paths. Ran into the problem when pulling links from a remote page.

<?php

function canonicalize($address)
{
   
$address explode('/'$address);
   
$keys array_keys($address'..');

    foreach(
$keys AS $keypos => $key)
    {
       
array_splice($address$key - ($keypos 1), 2);
    }

   
$address implode('/'$address);
   
$address str_replace('./'''$address);
}

$url 'http://www.example.com/something/../else';
echo 
canonicalize($url); //http://www.example.com/else

?>
2006-11-22 21:38:23
http://php5.kiev.ua/manual/ru/function.realpath.html
This is my attempt at writing a realpath replacement. I needed to to run some Adobe code on a server with realpath disabled and this seemed to do the job. It is written for a unix server, I suppose it could be made cross platform using DIRECTORY_SEPARATOR. (With thanks to Marc Noirot for his code).

<?php
function myRealPath($path) {

   
// check if path begins with "/" ie. is absolute
    // if it isnt concat with script path
   
if (strpos($path,"/") !== 0) {
       
$base=dirname($_SERVER['SCRIPT_FILENAME']);
       
$path=$base."/".$path;
    }
 
   
// canonicalize
   
$path=explode('/'$path);
   
$newpath=array();
    for (
$i=0$i<sizeof($path); $i++) {
        if (
$path[$i]==='' || $path[$i]==='.') continue;
           if (
$path[$i]==='..') {
             
array_pop($newpath);
              continue;
        }
       
array_push($newpath$path[$i]);
    }
   
$finalpath="/".implode('/'$newpath);

   
// check then return valid path or filename
   
if (file_exists($finalpath)) {
        return (
$finalpath);
    }
    else return 
FALSE;
}
?>
2007-06-26 02:55:25
http://php5.kiev.ua/manual/ru/function.realpath.html
Here's a little function to return the relative path between two urls:

<?php

   
function get_relative_path($start_dir$final_dir){
       
//
       
$firstPathParts explode(DIRECTORY_SEPARATOR$start_dir);
       
$secondPathParts explode(DIRECTORY_SEPARATOR$final_dir);
       
//
       
$sameCounter 0;
        for(
$i 0$i mincount($firstPathParts), count($secondPathParts) ); $i++) {
            if( 
strtolower($firstPathParts[$i]) !== strtolower($secondPathParts[$i]) ) {
                break;
            }
           
$sameCounter++;
        }
        if( 
$sameCounter == ) {
            return 
$final_dir;
        }
       
//
       
$newPath '';
        for(
$i $sameCounter$i count($firstPathParts); $i++) {
            if( 
$i $sameCounter ) {
               
$newPath .= DIRECTORY_SEPARATOR;
            }
           
$newPath .= "..";
        }
        if( 
count($newPath) == ) {
           
$newPath ".";
        }
        for(
$i $sameCounter$i count($secondPathParts); $i++) {
           
$newPath .= DIRECTORY_SEPARATOR;
           
$newPath .= $secondPathParts[$i];
        }
       
//
       
return $newPath;
    }

?>
2007-07-16 14:49:03
http://php5.kiev.ua/manual/ru/function.realpath.html
There might be other solutions like mine in here, 
but here is one more.

This function converts Virtual Paths into Relative Paths. 
I needed that at one time, and I did'nt have much luck finding a solution amongst the PHP Functions in the manual.

<?php
function GetPath($RedPath) {

  if(
substr($RedPath01) == "/") {
   
$SysPath dirname($_SERVER['PHP_SELF']); 

    if(
substr($RedPath, -1) == "/"$RedPath substr($RedPath0, -1);

    if(
strlen($SysPath) == 1)
      return 
".".$RedPath;
    elseif(
strcmp($SysPath,$RedPath) == 0)
      return 
"./"

    else {
     
$s_tmp split("/"$SysPath);
     
$r_tmp split("/"$RedPath);

      while((
$r_tmp[$i] == $s_tmp[$i]) && $i 10)
       
$i++;

     
$t_RedPath end(split("/"$RedPath, ($i+1))); 

      if(
$i == count($s_tmp))
        return 
"./".$t_RedPath;
      else
        return 
str_repeat("../"count($s_tmp)-$i).$t_RedPath;
    }
  }
  else
    return 
$RedPath;

}
?>
2007-07-24 10:22:16
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Given real paths of two files, this function finds the relative path of one ($dest) with respect to the other ($root).

<?php
echo rel_path('a/b/c''d/e'); // './../../a/b/c'
echo rel_path('a/b/c''a/b/c/d/e'); // './../..'
echo rel_path('a/b/c/d/e''a/b/c'); // './d/e'

function rel_path($dest$root ''$dir_sep '/')
{
 
$root explode($dir_sep$root);
 
$dest explode($dir_sep$dest);
 
$path '.';
 
$fix '';
 
$diff 0;
 for(
$i = -1; ++$i max(($rC count($root)), ($dC count($dest)));)
 {
  if(isset(
$root[$i]) and isset($dest[$i])) 
  {
   if(
$diff)
   {
   
$path .= $dir_sep'..';
   
$fix .= $dir_sep$dest[$i];
    continue;
   }
   if(
$root[$i] != $dest[$i])
   {
   
$diff 1;
   
$path .= $dir_sep'..';
   
$fix .= $dir_sep$dest[$i];
    continue;
   }
  }
  elseif(!isset(
$root[$i]) and isset($dest[$i]))
  {
   for(
$j $i-1; ++$j $dC;)
   {
   
$fix .= $dir_sep$dest[$j];
   }
   break;
  }
  elseif(isset(
$root[$i]) and !isset($dest[$i]))
  {
   for(
$j $i-1; ++$j $rC;)
   {
   
$fix $dir_sep'..'$fix;
   }
   break;
  } 
 }
  return 
$path$fix;
}
?>
2007-08-20 05:52:24
http://php5.kiev.ua/manual/ru/function.realpath.html
Here's a little function to return the shortest relative path between dest folder and current folder (you can be replace $_SERVER['PHP_SEFL'] by your variable folder) :

<?php
// if you run in /var/www/

echo UnRealPath ('./'); // return "./"
echo UnRealPath ('./ajax-browser/AJAX-B/scripts/'); // return "./ajax-browser/AJAX-B/scripts/"
echo UnRealPath ('/var/'); // return "./../"
echo UnRealPath ('/opt/picasa/wine/'); // return "./../../opt/picasa/wine/"

function UnRealPath ($dest)
{
   
$Ahere explode ('/'realpath($_SERVER['PHP_SEFL']));
   
$Adest explode ('/'realpath($dest));
   
$result '.'// le chemin retouné dois forcement commancé par ./   c'est le but
   
while (implode ('/'$Adest) != implode ('/'$Ahere))// && count ($Adest)>0 && count($Ahere)>0 )
   
{
        if (
count($Ahere)>count($Adest))
        {
           
array_pop($Ahere);
           
$result .= '/..';
        }
        else
        {
           
array_pop($Adest);
        }
    }
    return 
str_replace('//''/'$result.str_replace(implode ('/'$Adest), ''realpath($dest)).(@is_dir(realpath($dest))?'/':''));
}
?>
2007-09-21 15:15:31
http://php5.kiev.ua/manual/ru/function.realpath.html
Sometimes it is helpful to check for the existance of a file
which might be found by using the include_path like in 

<?php
include("file_from_include_path.php");
?>

A simple function iterates the include_path and tries all
possibilites, returns translated_local_path on success or false
if not found.

<?php
function mappath($path_to_translate){
 
$IncludePath=explode(PATH_SEPARATOR,get_include_path());
  foreach(
$IncludePath as $prefix){
    if(
substr($prefix,-1)==DIRECTORY_SEPARATOR)
     
$prefix=substr($prefix,0,-1);
   
$try_path=sprintf("%s%s%s"
     
,$prefix,DIRECTORY_SEPARATOR,$path_to_translate);
    if(
file_exists($try_path))return($try_path);
  }
  return 
false;
}
?>
2007-10-03 11:25:23
http://php5.kiev.ua/manual/ru/function.realpath.html
<?php
//rp like, working with absolute/relative path & a little bit shorter :p 

function rp($path) {
   
$out=array();
    foreach(
explode('/'$path) as $i=>$fold){
        if (
$fold=='' || $fold=='.') continue;
        if (
$fold=='..' && $i>&& end($out)!='..'array_pop($out);
    else 
$out[]= $fold;
    } return (
$path{0}=='/'?'/':'').join('/'$out);
}
?>
2008-03-19 19:34:06
http://php5.kiev.ua/manual/ru/function.realpath.html
I made this function so that I could see if a user was trying to go above the current directory.

My top dir:
/var/www/dir/

User wanted
/var/www/

This comes in handy when you're making a php explorer/filemanager and you want your files in the directory above to be private.

Here it is

<?php
//usage
//$dir is the dir you are in
//$dir_top is the highest dir allowed.

//example
/*
if(above_dir('../', '/var/www/filemgr'))
    die('Not allowed. Please stick to your directories');
*/
function above_dir($dir$dir_top){
    if(
$dir == $dir_top)
        return 
false;
   
   
$dir realpath($dir);
   
$dir_top realpath($dir_top);
   
   
$dir count(explode('/'$dir));
   
$dir_top count(explode('/'$dir_top));
   
    if(
$dir <= $dir_top){
        return 
true;
    }else{
        return 
false;
    }
}

?>
2008-06-08 11:49:53
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Because realpath() does not work on files that do not
exist, I wrote a function that does.
It replaces (consecutive) occurences of / and \\ with
whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine.
Paths returned by get_absolute_path() contain no
(back)slash at position 0 (beginning of the string) or
position -1 (ending)
<?php
   
function get_absolute_path($path) {
       
$path str_replace(array('/''\\'), DIRECTORY_SEPARATOR$path);
       
$parts array_filter(explode(DIRECTORY_SEPARATOR$path), 'strlen');
       
$absolutes = array();
        foreach (
$parts as $part) {
            if (
'.' == $part) continue;
            if (
'..' == $part) {
               
array_pop($absolutes);
            } else {
               
$absolutes[] = $part;
            }
        }
        return 
implode(DIRECTORY_SEPARATOR$absolutes);
    }
?>

A test:
<?php
    var_dump
(get_absolute_path('this/is/../a/./test/.///is'));
?>
Returns: string(14) "this/a/test/is" 

As you can so, it also produces Yoda-speak. :)
2008-06-23 18:43:59
http://php5.kiev.ua/manual/ru/function.realpath.html
If you need to resolve a url against a base url, as the browser does with anchor tags, then realpath won't help, because it's not on your file system.

This function does that:

<?php
function resolve_href ($base$href) {
     
   
// href="" ==> current url.
   
if (!$href) {
        return 
$base;
    }

   
// href="http://..." ==> href isn't relative
   
$rel_parsed parse_url($href);
    if (
array_key_exists('scheme'$rel_parsed)) {
        return 
$href;
    }

   
// add an extra character so that, if it ends in a /, we don't lose the last piece.
   
$base_parsed parse_url("$base ");
   
// if it's just server.com and no path, then put a / there.
   
if (!array_key_exists('path'$base_parsed)) {
       
$base_parsed parse_url("$base/ ");
    }

   
// href="/ ==> throw away current path.
   
if ($href{0} === "/") {
       
$path $href;
    } else {
       
$path dirname($base_parsed['path']) . "/$href";
    }

   
// bla/./bloo ==> bla/bloo
   
$path preg_replace('~/\./~''/'$path);

   
// resolve /../
    // loop through all the parts, popping whenever there's a .., pushing otherwise.
       
$parts = array();
        foreach (
           
explode('/'preg_replace('~/+~''/'$path)) as $part
       
) if ($part === "..") {
           
array_pop($parts);
        } elseif (
$part!="") {
           
$parts[] = $part;
        }

    return (
        (
array_key_exists('scheme'$base_parsed)) ?
           
$base_parsed['scheme'] . '://' $base_parsed['host'] : ""
   
) . "/" implode("/"$parts);

}
?>

[EDIT BY danbrown AT php DOT net:  Code contains a bugfix supplied by (Zhenya DOT Morozov AT gmail DOT com) on 23-JAN-09, to address the following issue:
'If your path contains "0" (or any "false" string) directory name, the function removes that directory from the path.']
2008-08-27 22:02:01
http://php5.kiev.ua/manual/ru/function.realpath.html
for those who want to start realpath on windows platform and looking for example.

OR

for those who want to run zend framework on windows platform using the quick start guide 

<?php
define
"_CUR_OS"substrphp_uname( ), 0) == "Windows" "Win" "_Nix" );

function 
checkCurrentOS$_OS )
{
    if ( 
strcmp$_OS_CUR_OS ) == ) {
        return 
true;
    }
    return 
false;
}

// public/index.php
//
// Step 1: APPLICATION_PATH is a constant pointing to our
// application/subdirectory. We use this to add our "library" directory
// to the include_path, so that PHP can find our Zend Framework classes.

if ( checkCurrentOS"Win" ) ) {
   
$mappath '/' str_replace"\\""/"str_replace"C:\\",""dirname(__FILE__) ) );
}
else {
   
$mappath dirname(__FILE__);
}

define('APPLICATION_PATH'realpath$mappath '/../_privateadico/application/') );
set_include_path(
   
APPLICATION_PATH '/../library' 
   
PATH_SEPARATOR get_include_path()
);
?>

I took the index.php for zend which is was written for unix and ported it to windows.

The porting problem was with realpath function not understanding dirname(__FILE__) syntex on windows
2009-02-15 16:13:40
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
<?php

Class RealPath
{
    private 
$ServerPath;
    private 
$ScriptPath;
    private 
$AddSlashEnd;

    function 
__construct()
    {
       
$this->AddSlashEnd "";
       
       
$this->ServerPath $_SERVER['DOCUMENT_ROOT'];
       
$this->ScriptPath substr(dirname($_SERVER['SCRIPT_FILENAME']), strlen($this->ServerPath));
    }
   
    private function 
Server($adress)
    {
       
$ThisPath = @realpath($adress);
       
$ThisPathLength strlen($ThisPath);
   
        return 
substr($ThisPathstrlen($this->ServerPath), $ThisPathLength);
    }
   
    public function 
Absolute($adress)
    {
        return 
$_SERVER['SERVER_NAME'] . $this->Server($adress) . $this->AddSlashEnd;
    }
   
    public function 
RelativeServer($adress)
    {
        return 
$this->Server($adress) . $this->AddSlashEnd;
    }

    public function 
RelativeScript($adress)
    {
       
$ScriptExplode explode("/"$this->ScriptPath);
       
$ServerExplode explode("/"$this->Server($adress));
       
       
$TmpCount $ScriptCount count($ScriptExplode);
       
$ServerCount count($ServerExplode);
       
       
$ReturnPath "";
       
        for(
$i 1$i $TmpCount$i++)
        {
            if(
$ScriptExplode[$i] == $ServerExplode[$i])
                --
$ScriptCount;
            else
                break;
        }
       
        for(
$i 1$i $ScriptCount$i++)
           
$ReturnPath .= "/..";

        for(
$i $TmpCount $ScriptCount 1$i $ServerCount$i++)
           
$ReturnPath .= "/" $ServerExplode[$i];
       
        return 
$ReturnPath $this->AddSlashEnd;
    }

    public function 
AddSlash($value)
    {
        if(
is_bool($value))
        {
           
$this->AddSlashEnd = ($value)? "/" "";
            return 
true;
        }
        else
            return 
false;
    }
   
}

example:

$ObjectPath = new RealPath;
$ObjectPath->RelativeScript("../a/b../c/d/f../g../h");
2009-04-16 16:57:58
http://php5.kiev.ua/manual/ru/function.realpath.html
if you just need to resolve a path that is not on your system, or you don't want to chdir to it, a simple regular expression can do the trick:

<?php

$p 
'/cool/yeah/../zzz';

$p preg_replace('/\w+\/\.\.\//'''$p);

echo 
$p//outputs /cool/zzz

?>
2009-12-01 06:08:20
http://php5.kiev.ua/manual/ru/function.realpath.html
You may want to change script behavior depending on the way how its code is invoked (included by another script / called directly). Following code do the job
<?php
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {
 
// called directly
 
...
} else {
 
// included
 
...
}
?>
2009-12-03 11:01:16
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
There is no native function that does the opposite.

Pure-php implementation:

<?php
function getRelativePath$path$compareTo ) {
       
// clean arguments by removing trailing and prefixing slashes
       
if ( substr$path, -) == '/' ) {
           
$path substr$path0, -);
        }
        if ( 
substr$path0) == '/' ) {
           
$path substr$path);
        }

        if ( 
substr$compareTo, -) == '/' ) {
           
$compareTo substr$compareTo0, -);
        }
        if ( 
substr$compareTo0) == '/' ) {
           
$compareTo substr$compareTo);
        }

       
// simple case: $compareTo is in $path
       
if ( strpos$path$compareTo ) === ) {
           
$offset strlen$compareTo ) + 1;
            return 
substr$path$offset );
        }

       
$relative  = array(  );
       
$pathParts explode'/'$path );
       
$compareToParts explode'/'$compareTo );

        foreach( 
$compareToParts as $index => $part ) {
            if ( isset( 
$pathParts[$index] ) && $pathParts[$index] == $part ) {
                continue;
            }

           
$relative[] = '..';
        }

        foreach( 
$pathParts as $index => $part ) {
            if ( isset( 
$compareToParts[$index] ) && $compareToParts[$index] == $part ) {
                continue;
            }

           
$relative[] = $part;
        }

        return 
implode'/'$relative );
    }
?>

Some tests forr phpunit:

<?php
   
static public function getRelativePathProvider(  )  {
        return array( 
            array( 
               
'/srv/foo/bar',
               
'/srv',
               
'foo/bar',
            ),
            array( 
               
'/srv/foo/bar',
               
'/srv/',
               
'foo/bar',
            ),
            array( 
               
'/srv/foo/bar/',
               
'/srv',
               
'foo/bar',
            ),
            array( 
               
'/srv/foo/bar/',
               
'/srv/',
               
'foo/bar',
            ),
            array( 
               
'/srv/foo/bar',
               
'/srv/test',
               
'../foo/bar',
            ),
            array( 
               
'/srv/foo/bar',
               
'/srv/test/fool',
               
'../../foo/bar',
            ),
            array( 
               
'/srv/mad/xp/mad/model/static/css/uni-form.css',
               
'/srv/mad/xp/liria/',
               
'../mad/model/static/css/uni-form.css',
            ),
        );
    }

   
/**
     * @dataProvider getRelativePathProvider
     */
   
public function testGetRelativePath$path$compareTo$expected ) {
       
$result getRelativePath$path$compareTo );
       
$this->assertEquals$expected$result );
    }
?>
2010-05-13 15:04:31
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Please be aware that this function does NOT always strip a trailing slash!:

LINUX (tested with PHP 5.2.11):
---
realpath('.')
: string = "/myhttpdfolder" 
realpath('./')
: string = "/myhttpdfolder" 
realpath('fileadmin')
: string = "/myhttpdfolder/fileadmin" 
realpath('fileadmin/')
: string = "/myhttpdfolder/fileadmin" 

WINDOWS (tested with PHP 5.2.5):
---
realpath('.')
: string = "C:\\myhttpdfolder" 
realpath('./')
: string = "C:\\myhttpdfolder\\" 
realpath('fileadmin')
: string = "C:\\myhttpdfolder\\fileadmin" 
realpath('fileadmin/')
: string = "C:\\myhttpdfolder\\fileadmin\\"
2010-06-11 03:35:26
http://php5.kiev.ua/manual/ru/function.realpath.html
please note that realpath is a performance killer

on my sys listing 100 files with realpath takes 0.2 sec (core2quad 6600 x64 4gbddr2)

in most cases, its better to use getcwd() instead and work with dirname() to resolve ".."
2011-04-13 12:55:25
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Here is a small and handy method to calculate the relative path from $from to $to. Note: On Windows it does not work when $from and $to are on different drives.

<?php
function relativePath($from$to$ps DIRECTORY_SEPARATOR)
{
 
$arFrom explode($psrtrim($from$ps));
 
$arTo explode($psrtrim($to$ps));
  while(
count($arFrom) && count($arTo) && ($arFrom[0] == $arTo[0]))
  {
   
array_shift($arFrom);
   
array_shift($arTo);
  }
  return 
str_pad(""count($arFrom) * 3'..'.$ps).implode($ps$arTo);
}
?>
2011-09-21 17:20:40
http://php5.kiev.ua/manual/ru/function.realpath.html
Note that under Windows, a slash-rooted path will resolve on the local drive, and *not* necessarily C:\.

For example:

M:\>php -r "print realpath('/AUTOEXEC.BAT');"
[prints nothing, because there is no M:\AUTOEXEC.BAT]

But:

M:\>C:
C:\>php -r "print realpath('/AUTOEXEC.BAT');"
C:\AUTOEXEC.BAT

Same script, different response depending on current drive.

I'm inclined to argue that this function *should* use the value of %SystemDrive% as the "slash root" base.
2011-10-18 15:15:56
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
If using Windows junction.exe to create a symlink, it seems impossible to get the real path to the file. Even __FILE__ contains the symlinked path, not the actual path of the file.
2012-01-08 15:37:49
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Note: If you use this to check if a file exists, it's path will be cached, and returns true even if the file is removed (use file_exists instead).
2012-05-31 19:48:59
http://php5.kiev.ua/manual/ru/function.realpath.html
Needed a method to normalize a virtual path that could handle .. references that go beyond the initial folder reference. So I created the following.
<?php

function normalizePath($path)
{
   
$parts = array();// Array to build a new path from the good parts
   
$path str_replace('\\''/'$path);// Replace backslashes with forwardslashes
   
$path preg_replace('/\/+/''/'$path);// Combine multiple slashes into a single slash
   
$segments explode('/'$path);// Collect path segments
   
$test '';// Initialize testing variable
   
foreach($segments as $segment)
    {
        if(
$segment != '.')
        {
           
$test array_pop($parts);
            if(
is_null($test))
               
$parts[] = $segment;
            else if(
$segment == '..')
            {
                if(
$test == '..')
                   
$parts[] = $test;

                if(
$test == '..' || $test == '')
                   
$parts[] = $segment;
            }
            else
            {
               
$parts[] = $test;
               
$parts[] = $segment;
            }
        }
    }
    return 
implode('/'$parts);
}
?>

Will convert /path/to/test/.././..//..///..///../one/two/../three/filename
to ../../one/three/filename
2013-06-07 14:37:12
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
When using realpath (and similar functions) remember that PHP will take in to account open_basedir restrictions. So, if you do something like:

<?php
// test.php in httpdocs folder
$path realpath(dirname(__FILE__) . '/../application');
?>

where your open_basedir setting is set to the httpdocs folder and tmp, this will return false. You must set it to the level above (or off) for this to work.
2013-07-17 10:40:09
http://php5.kiev.ua/manual/ru/function.realpath.html
It's strange, but  realpath('C:/wamp/www/sdo-test/data') sometime retuns false, use // or \ instead.
2014-08-27 09:44:07
http://php5.kiev.ua/manual/ru/function.realpath.html
Автор:
Beware of relative symbolic links like this one (ext4 file system on Ubuntu) :

    vincent@vincent:~/Bureau/dirscan$ readlink sandbox/roulant/voiture/cabriolet/ln-loop-relative
    ../..

In this case, realpath may return false :

<?php
var_dump
(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative'));
// => string(44) "/home/vincent/Bureau/dirscan/sandbox/roulant"
var_dump(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative/moto'));
// => bool(false)
?>

But you can fix it by clearing the realpath cache, this way :

<?php
var_dump
(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative'));
clearstatcache(true);
var_dump(realpath('sandbox/roulant/voiture/cabriolet/ln-loop-relative/moto'));
// => string(49) "/home/vincent/Bureau/dirscan/sandbox/roulant/moto"
?>
2015-04-21 16:33:21
http://php5.kiev.ua/manual/ru/function.realpath.html
Be aware that realpath() doesn't work with hidden Windows UNC paths, eg  \\servername\share$\folder\blah.txt but other PHP file-functions can access that file fine.
2015-12-07 00:42:38
http://php5.kiev.ua/manual/ru/function.realpath.html
It should probably be expressly noted that tilde expansion is not performed by realpath.
2017-08-30 21:38:45
http://php5.kiev.ua/manual/ru/function.realpath.html

    Поддержать сайт на родительском проекте КГБ