File_exists函数无法通过symlink目录与相对路径一起正常工作

时间:2015-01-20 14:56:31

标签: php

我创建了简单的代码来重现这个问题:

<?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测试了这段代码。

2 个答案:

答案 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