Localhost(XAMPP)响应过慢求助:未改配置却页面加载耗时久
页面加载缓慢问题排查与优化方案
问题背景
未修改XAMPP任何默认设置,启动Apache和MySQL后访问index.php页面,Chrome加载指示器需转动27秒才完成加载,后续加载耗时甚至达到34秒。页面核心功能为列出90张图片及相关详情,核心代码如下:
$absql = "SELECT * FROM `titles` ORDER BY date_created DESC LIMIT 90"; $result = $conn->query($absql); // print_r($result); if ($result->num_rows > 0) { // output data of each row while ($row1 = $result->fetch_assoc()) { $txtID[] = $row1['uniq']; } } // print_r($txtID); $txtsToFind = implode(",", $txtID); $get_title_txt = glob(__DIR__ . "/library/*/*{{$txtsToFind}}.txt", GLOB_BRACE); //Then used each file above to display details
性能瓶颈分析
- glob函数的低效遍历:使用
GLOB_BRACE匹配90个目标文件时,glob会递归遍历library下的所有子目录与文件,展开90个匹配规则后,遍历开销呈指数级增长,这是加载缓慢的核心原因。 - 数据库排序无索引:如果
titles表的date_created字段未加索引,ORDER BY date_created DESC会触发全表扫描并排序,额外增加数据库查询耗时。 - 文件I/O累积开销:后续逐个读取txt文件的操作,若未做批量优化,会进一步累积加载时间。
优化方案
给数据库字段添加索引:为
date_created字段创建降序索引,加速排序查询:ALTER TABLE `titles` ADD INDEX `idx_date_created` (`date_created` DESC);若
uniq字段是唯一标识,也建议为其添加索引,提升后续关联操作的效率。替换glob,直接构造文件路径:利用已知的
uniq值,直接遍历子目录检查文件是否存在,避免glob的全目录扫描:$get_title_txt = []; $libraryDir = __DIR__ . "/library"; // 获取library下的所有子目录 $subDirs = array_diff(scandir($libraryDir), ['.', '..']); foreach ($txtID as $uniq) { foreach ($subDirs as $dir) { $filePath = "{$libraryDir}/{$dir}/{$uniq}.txt"; if (file_exists($filePath)) { $get_title_txt[] = $filePath; break; // 找到目标文件后立即跳出循环,减少遍历次数 } } }若子目录规则与数据库字段关联(比如
titles表存了文件所在子目录),直接从数据库获取该字段值,可彻底省去子目录遍历步骤,直接构造准确路径。缓存文件路径结果:若文件不会频繁更新,可将查询到的文件路径缓存到数据库新增字段、本地缓存文件中,避免每次请求都重复遍历目录。
优化文件读取流程:读取txt文件内容时,采用批量读取方式,或使用缓冲I/O函数(如
file_get_contents()批量处理),减少磁盘I/O操作次数。
内容的提问来源于stack exchange,提问作者Bob D. Builder
相关产品推荐
相关产品推荐

