is_link 能准确判断路径是否为符号链接,但需配合 clearstatcache() 避免缓存干扰;返回 false 不代表“不是符号链接”,可能因路径不存在或缓存未更新;应先用 lstat 确认存在性,再调用 is_link,且不可与 realpath 混用。

is_link 能准确判断一个路径是否为符号链接,但它不是万能的——不配合 clearstatcache() 或与其他函数混用时,结果可能被缓存干扰或逻辑错位。
is_link 返回 false 不代表“不是符号链接”
常见错误是看到 is_link($path) 返回 false 就认为该路径肯定不是符号链接。但实际可能只是:clearstatcache() 没调用,导致缓存了旧状态;或者路径本身不存在(此时也返回 false,和“存在但非链接”无法区分)。
- 先用
file_exists($path)或lstat($path)确认路径物理存在,再调用is_link($path) - 若需连续多次检测(如循环扫描目录),每次调用前加
clearstatcache(true, $path)清除单路径缓存,避免误判 -
is_link在 PHP 7.4 中仍不支持stream_wrapper_register自定义协议,对phar://或zip://路径会直接返回false
与 file_exists 混用时的逻辑陷阱
开发者常写 if (file_exists($path) && is_link($path)) 来“安全识别坏链”,但这是危险组合:当 $path 是损坏的符号链接(目标不存在)时,file_exists($path) 返回 false,整个条件直接跳过,is_link 根本不会执行——你压根没机会发现它是个链接。
- 想确认“是不是符号链接”,就只用
is_link($path),别加file_exists前置判断 - 想区分“坏链”和“普通文件”,应改用
lstat($path):成功返回数组说明链接存在(无论目标是否有效),失败才说明路径不存在 - 若需同时知道“是否存在”和“是否为链接”,分两步:先
lstat($path),再根据返回值判断is_link或is_file
PHP 7.4 下 realpath + is_link 的典型误用
有人试图用 realpath($path) 配合 is_link 来“先解析再判断”,但 realpath 会直接跳转到目标并返回真实路径——此时你传给 is_link 的已经是目标路径,不再是原链接本身,必然返回 false。
-
is_link必须作用于符号链接本身的路径,不能作用于realpath结果 - 正确做法是:先
is_link($path)判断是否为链接;若是,再用readlink($path)获取指向路径,用realpath解析目标是否合法 - 注意
readlink在目标路径过长或权限不足时会返回false,需单独处理
最易被忽略的是缓存行为——PHP 7.4 默认启用 stat 缓存,且 is_link 和 file_exists 共享同一缓存池。哪怕你只调用了一次 file_exists,后续的 is_link 可能读到过期结果。这不是 bug,是设计使然,但必须主动应对。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











