Edit report at https://bugs.php.net/bug.php?id=61933&edit=1
ID: 61933 Updated by: paj...@php.net Reported by: david at panmedia dot co dot nz Summary: realpath not resolving symlinks corrrectly Status: Feedback Type: Bug Package: *Directory/Filesystem functions Operating System: Windows Vista/7 PHP Version: Irrelevant Block user comment: N Private report: N New Comment: SO yes, it is a Linux specific implementation. Nothing that PHP can do about it and doing it for php's realpath implementation (windows or other unix, ts mode too sometimes) is not possible without issues like performance degradation. Previous Comments: ------------------------------------------------------------------------ [2012-05-03 23:11:12] david at panmedia dot co dot nz @pajoye, sorry, NTS on Linux too. ------------------------------------------------------------------------ [2012-05-03 23:04:48] paj...@php.net I mean on linux too, is it TS or NTS? ------------------------------------------------------------------------ [2012-05-03 22:58:18] david at panmedia dot co dot nz @pajoye I am using VC9 NTS version on Windows. ------------------------------------------------------------------------ [2012-05-03 22:43:36] paj...@php.net It does work, it gives you the target of the given link. The only difference is an OS specific implementation where all links are resolved. I suppose you use a TS php on windows and a NTS on linux, right? ------------------------------------------------------------------------ [2012-05-03 21:32:36] david at panmedia dot co dot nz Description: ------------ When creating a symlink in Windows to an absolute path with a lower case drive letter, PHP will not resolve the canonicalized absolute pathname (realpath) correctly. This is obvious when you have nested symlinks. When you run realpath of a nested symlink it returns the next symlink it links to, rather than the top absolute pathname. On Linux it works correctly. One work around that can be used is: $link = 'f:\link3'; do { $link = realpath($link); } while (realpath($link) !== false && $link !== realpath($link)); Test script: --------------- Windows test: F:\>mkdir target F:\>mklink /D link1 f:\target F:\>mklink /D link2 f:\link1 F:\>mklink /D link3 f:\link2 F:\>php -r "var_dump(realpath('link3'));" Linux test: $ mkdir target $ ln -s target link1 $ ln -s link1 link2 $ ln -s link2 link3 $ php -r "var_dump(realpath('link3'));" Expected result: ---------------- Windows test: string(9) "F:\target" Linux test: string(12) "/root/target" Actual result: -------------- Windows test: string(9) "f:\\link2" Linux test: string(12) "/root/target" ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61933&edit=1