PHP读取TXT文件本地XAMPP正常 部署服务器仅读首行故障排查
故障排查与修复方案
调试阶段可以先在代码最顶部加入以下配置,直接输出具体错误信息,不用盲目排查问题:
error_reporting(E_ALL); ini_set('display_errors', 1);
核心故障点1:PHP版本不兼容导致脚本提前终止
你代码中使用的str_contains()是PHP 8.0才正式加入的内置函数,本地XAMPP环境通常预装较高版本PHP可以正常运行,但绝大多数托管服务器默认运行的PHP版本为7.x甚至更低,不存在该函数,代码执行到第一行的字符串判断逻辑时会直接抛出致命错误终止运行,表现就是仅能读取首行、后续逻辑完全不执行,这也是你转换换行符没有效果的核心原因。
修复方式二选一:
- 登录服务器托管面板,将运行PHP版本切换到8.0及以上
- 若无法升级PHP版本,手动实现兼容的字符串包含判断逻辑,放到所有业务代码之前,替换所有
str_contains调用
兼容写法示例:
if (!function_exists('str_contains')) { function str_contains($haystack, $needle) { return $needle !== '' && mb_strpos($haystack, $needle) !== false; } }
核心故障点2:文件读取逻辑鲁棒性不足
你当前使用的while (!feof($file))读取写法存在隐性缺陷:如果文件末尾存在空行、某行读取失败返回false,会将无效值写入预约数组,后续访问数组下标时会触发错误中断执行。
修正后的完整读取逻辑:
$file = fopen("foglalasi_adatok/foglalodb.txt", 'r'); if (!$file) { die("无法打开数据文件,请检查文件权限与路径"); } $foglalsok = array(); $foglalas_datumLista=array(); $darabszam = 0; // 直接判断fgets返回值,读到文件末尾自动退出循环 while (($line = fgets($file)) !== false) { // 去掉行首尾的空白、换行符,空行直接跳过 $line = trim($line); if (empty($line)) { continue; } $foglalasok[$darabszam] = explode(';', $line); // 校验行字段数,缺字段的异常行直接跳过 if (count($foglalasok[$darabszam]) < 9) { $darabszam++; continue; } $temp_foglalasok_array=getBetweenDates($foglalasok[$darabszam][4], $foglalasok[$darabszam][5]); if(str_contains($foglalasok[$darabszam][8],"nem foglalhato")) { for($var=0;$var<sizeof($temp_foglalasok_array);$var++) { $temp_foglalasok_array[$var].="n"; } } else if(str_contains($foglalasok[$darabszam][8],"elutasitva")) { for($var=0;$var<sizeof($temp_foglalasok_array);$var++) { $temp_foglalasok_array[$var].="f"; } } else { // 校验日期数组长度,避免下标越界报错 if (count($temp_foglalasok_array) >= 2) { for($var=1;$var<sizeof($temp_foglalasok_array)-1;$var++) { $temp_foglalasok_array[$var].="o"; } $temp_foglalasok_array[0].="e"; $temp_foglalasok_array[sizeof($temp_foglalasok_array)-1].="h"; } } $foglalas_datumLista=array_merge($foglalas_datumLista, $temp_foglalasok_array); $darabszam = $darabszam + 1; } fclose($file);
其他潜在兼容问题
你写的getBetweenDates函数中用$currentDate += 86400的方式累加日期,在Unix服务器配置了带夏令时的时区时,会因为某一天实际时长不是86400秒导致死循环、日期重复/缺失的问题,建议改用PHP原生的DatePeriod类做日期间隔遍历,同时增加日期格式校验,兼容性更好:
function getBetweenDates($startDate, $endDate) { $rangArray = []; $start = DateTime::createFromFormat('Ymd', $startDate); $end = DateTime::createFromFormat('Ymd', $endDate); // 日期格式错误或开始日期晚于结束日期,直接返回空数组避免后续报错 if (!$start || !$end || $start > $end) { return $rangArray; } $end->modify('+1 day'); // 保证遍历结果包含结束日期 $interval = new DateInterval('P1D'); $period = new DatePeriod($start, $interval, $end); foreach ($period as $date) { $rangArray[] = $date->format('Y-m-d'); } return $rangArray; }
另外你提供的示例数据里第三行结束日期写的是202201015,是9位数字不符合YYYYMMDD的8位格式,也会导致日期解析失败,要检查源数据有没有类似的错误格式。
内容的提问来源于stack exchange,提问作者Shapperd
相关产品推荐
相关产品推荐

