我创建了简单的代码来重现这个问题:
<?php
exec('mkdir foo');
exec('mkdir foo/bar');
exec('touch foo/bar/example.txt');
exec('ln -s foo/bar symlink');
exec('mkdir not_symlink');
$dir1 = 'symlink/../foo/bar/example.txt';
$dir2 = 'not_symlink/../foo/bar/example.txt';
$dir3 = 'symlink/example.txt';
$dir4 = 'foo/bar/example.txt';
$dir5 = 'foo/bar/../bar/example.txt';
$dir6 = 'symlink';
var_dump(file_exists($dir1)); // false ???
var_dump(file_exists($dir2)); // true
var_dump(file_exists($dir3)); // true
var_dump(file_exists($dir4)); // true
var_dump(file_exists($dir5)); // true
var_dump(file_exists($dir6)); // true
为什么file_exists为$dir1
返回false?我在php文档中找不到这种行为的任何解释。
我在Ubuntu 14.04 64bit上用PHP 5.5.9测试了这段代码。
答案 0 :(得分:0)
exec('ln -s foo/bar symlink');
$dir1 = 'symlink/../foo/bar/example.txt';
解析符号链接后,$dir1
为'foo/bar/../foo/bar/example.txt'
。或者,简化'foo/foo/bar/example.txt'
。
那条路不存在。
答案 1 :(得分:0)
您尝试解决的路径是错误的。
$ readlink -f symlink/../foo
/home/myuser/foo/foo
添加../
:
$ readlink -f symlink/../../foo/bar/example.txt
/home/myuser/foo/bar/example.txt