PHP 8.2下glob()读取网络路径返回空数组问题求助
解决PHP 8.2下glob()读取Windows网络路径返回空数组的问题
针对你升级到PHP 8.2后glob()读取UNC网络路径返回空的问题,结合Windows环境特性,以下是排查和解决方向:
1. 检查open_basedir配置限制
PHP 8.x对open_basedir的检查更严格,即使文件系统权限正常,若该配置未包含目标UNC路径,glob()会静默返回空数组。
- 打开XAMPP的
php.ini,查找open_basedir项 - 若配置了路径,添加目标UNC路径(格式:
//10.0.0.10/Docs)到允许列表,或者临时注释掉该配置测试 - 修改后重启Apache服务
2. 转义路径中的特殊匹配字符
你的路径包含(02000-02999),括号是glob()的特殊匹配字符(用于分组匹配),PHP 8.2对这类字符的解析规则更严格,需要转义:
// 转义路径中的括号(双引号下需双重转义反斜杠) $folder_path = "\\\\10.0.0.10\\Docs\\T\\T\\(02000-02999)\\T-02345"; // 或者改用正斜杠(PHP在Windows下支持正斜杠路径,无需转义) $folder_path = "//10.0.0.10/Docs/T/T(02000-02999)/T-02345";
3. 移除不必要的GLOB_BRACE参数
你的通配符*Scoping.[Pp][Dd][Ff]并未使用大括号匹配语法(如{pdf,PDF}),GLOB_BRACE参数属于多余配置,且PHP 8.x对该参数的Windows兼容性有调整,移除后测试:
$file = glob($folder_path . "/*Scoping.[Pp][Dd][Ff]");
4. 验证网络路径的可访问性
先确认PHP进程能正常访问目标共享目录:
// 测试目录是否存在 var_dump(is_dir($folder_path)); // 列出目录内容 var_dump(scandir($folder_path));
如果is_dir返回false,说明PHP进程无法访问该共享,需检查Windows Server 2019的SMB设置(比如确认Apache服务运行账户拥有共享访问权限,或调整SMB协议兼容配置)。
5. 替换glob()为DirectoryIterator(备选方案)
如果上述方法无效,可改用PHP的DirectoryIterator类遍历文件,避免glob()的版本兼容性问题:
$files = []; $iterator = new DirectoryIterator($folder_path); foreach ($iterator as $fileInfo) { if (!$fileInfo->isDot() && preg_match('/.*Scoping\.(pdf|PDF)$/i', $fileInfo->getFilename())) { $files[] = $fileInfo->getPathname(); } } var_dump($files);
内容的提问来源于stack exchange,提问作者sam6640621
相关产品推荐
相关产品推荐

