用PHP解析多个RSS源仅能获取最后一条源数据的问题求助
问题原因
- URL 存在不可见残留字符:你用
explode("\n")拆分源文件内容时,如果core/sources文件的换行符是 Windows 格式的\r\n,拆分后每个 URL 末尾会残留\r回车符,导致请求无效 RSS 地址,simplexml_load_file加载失败返回空。你调换源顺序后,排在前面的源都会因为这个问题加载失败,只有最后一行的 URL 不会残留额外换行符,所以能正常读取。 - 缺少错误校验逻辑:代码没有判断
simplexml_load_file的返回结果,加载失败时直接访问$feeds->channel->title会得到空值,也不会有明显的错误提示。
不需要手动结束 simplexml 的文件读取操作,这个问题和资源释放无关。
修复方案
遍历每个 URL 时先调用trim()清除首尾所有空白字符(包括回车、换行、空格等),同时增加加载结果的校验逻辑,修改后的参考代码如下:
if (file_exists("core/sources")) { $URLItems = array_filter(explode("\n", file_get_contents('core/sources'))); $totalPosts = array(); foreach ($URLItems as $rawUrl) { // 清除URL首尾的空白、换行、回车等不可见字符 $url = trim($rawUrl); // 校验URL格式合法再请求 if (!filter_var($url, FILTER_VALIDATE_URL)) { continue; } $feeds = simplexml_load_file($url); // 校验XML加载成功、且存在channel->title字段 if ($feeds && isset($feeds->channel->title)) { $sourceName = (string)$feeds->channel->title; array_push($totalPosts, $sourceName); } } print_r($totalPosts); }
内容的提问来源于stack exchange,提问作者Adam Rajnoha
相关产品推荐
相关产品推荐

