下午用豆包写了一个网页播放音乐的
放在linux系统里面一切正常
然后用一台windows server 2016+phpstudy
第一次使用的时候正常,后面刷新了一下页面,就出现了异常
播放列表以”乐”结尾的,会强制把文件夹路径带进去,导致无法播放
然后继续问AI,才得知如下:
# 问题根源(Windows Server2016 + phpstudy‑Apache 特有 BUG)
不是 “乐” 是多音字的问题。
**PHP 在 Windows 下,`basename()`、`glob()`、目录遍历函数是依赖系统 locale 区域语言设置的(GBK),而我们 PHP 脚本内部全部是 UTF‑8 编码CSDN博…。**
>
> 汉字「乐」UTF‑8 字节:`E4 B9 90`。
> Windows 文件系统存储文件名是 GBK 编码。当目录名**最后一个多字节汉字的 UTF‑8 字节边界刚好踩中特殊截断点**,PHP 的目录处理函数会出现字节截断错乱:把**文件夹名字末尾多出来一个反斜杠`\`**混入变量 `$entry`。
> 于是拼接:`$item.”/”.$f` 就变成了 `”快乐\ /歌曲.mp3″`,传入`urlencode()`之后,反斜杠被编码,带到 URL 参数,传到`play.php`,realpath 安全校验直接失败,文件找不到。
>
> 现象只出现在部分末尾汉字(乐、也、书等少数几个),Linux 服务器完全不会复现,只有 Windows PHP 会出现这个诡异 bugPHP。
真的匪夷所思
更搞的是
“但是我刚刚最开始好像是正常的,然后不知道怎么了突然就这样了 我记得最开始 “纯音乐” 这个文件夹里面的几首歌曲在全部歌曲这个播放列表里面是可以播放的 然后后面我什么都没动,好像就刷新了一下网页就突然不行了 为什么会这样最开始是正常的后面就不对了”
然后回答就是第一次php给分配了一个全新的线程,刷新以后线程被其他页面污染了,而导致出问题 …………




没有回复内容