PHP优化20万+PDF文件按修改日期分组统计性能问题求助
高效统计大目录下PDF文件修改日期并生成HTML报告的优化需求
我需要从目录/pdf_files/dir中获取PDF文件列表,生成按修改日期分组统计的HTML报告。但该目录包含20万+文件,当前三种实现方案运行速度极慢:
尝试1:使用glob与filemtime(耗时42秒)
<?php $array_ids = glob('/pdf_files/dir/*.pdf',GLOB_BRACE); foreach ( $array_ids as $x) { $array2[] = array($x, filemtime($x)); } $count_array = array(); foreach ($array2 as $x) { $mon = date ("m", filemtime($x[0])); $mon2 = date ("M", filemtime($x[0])); $year = date ("Y", filemtime($x[0])); ${'count_' . $year . '_' . $mon. '_' . $mon2} = ${'count_' . $year . '_' . $mon. '_' . $mon2} + 1 ; if (! in_array("count_${year}_${mon}_${mon2}" , $count_array ) ) { $count_array[] = "count_${year}_${mon}_${mon2}" ; } } sort($count_array); echo "<table border=1>"; foreach ( $count_array as $x) { $d_x = substr($x,-3) . ' ' . substr($x,6,4) ; echo "<tr><td style='text-align:center; vertical-align:middle; padding: 15px;'>$d_x</td><td style='text-align:center; vertical-align:middle; padding: 15px;'>${$x}</td></tr>"; $total = $total + $$x ; } echo "<tr><td style='text-align:center; vertical-align:middle; padding: 15px;'>Total</td><td style='text-align:center; vertical-align:middle; padding: 15px;'>$total</td></tr></table>"; ?>
尝试2:使用stat(耗时37秒)
<?php $count_array = array(); for ( $i = 1 ; $i < 10 ; $i++ ) { $output = shell_exec("cd /pdf_files/dir ; stat -c '%n,%Y' $i*.pdf"); if ($output != "" ) { $array2[] = explode("\n", $output); } } $array2 = call_user_func_array('array_merge', $array2); $array2 = array_filter($array2); foreach ($array2 as $x) { $filename = explode(",", $x)[0]; $filetime = explode(",", $x)[1]; $mon = date ("m", $filetime); $mon2 = date ("M", $filetime); $year = date ("Y", $filetime); ${'count_' . $year . '_' . $mon. '_' . $mon2} = ${'count_' . $year . '_' . $mon. '_' . $mon2} + 1 ; if (! in_array("count_${year}_${mon}_${mon2}" , $count_array ) ) { $count_array[] = "count_${year}_${mon}_${mon2}" ; } } sort($count_array); echo "<table border=1>"; foreach ( $count_array as $x) { $d_x = substr($x,-3) . ' ' . substr($x,6,4) ; echo "<tr><td style='text-align:center; vertical-align:middle; padding: 15px;'>$d_x</td><td style='text-align:center; vertical-align:middle; padding: 15px;'>${$x}</td></tr>"; $total = $total + $$x ; } echo "<tr><td style='text-align:center; vertical-align:middle; padding: 15px;'>Total</td><td style='text-align:center; vertical-align:middle; padding: 15px;'>$total</td></tr></table>"; ?>
尝试3:使用ls(耗时33秒)
<?php $count_array = array(); for ( $i = 1 ; $i < 10 ; $i++ ) { $output = shell_exec("cd /pdf_files/dir ; ls -l --time-style=\"+%s\" $i*.pdf | awk '{print $7 \",\" $6}'"); $array2[] = explode("\n", $output); } $array2 = call_user_func_array('array_merge', $array2); $array2 = array_filter($array2); foreach ($array2 as $x) { $filename = explode(",", $x)[0]; $filetime = explode(",", $x)[1]; $mon = date ("m", $filetime); $mon2 = date ("M", $filetime); $year = date ("Y", $filetime); ${'count_' . $year . '_' . $mon. '_' . $mon2} = ${'count_' . $year . '_' . $mon. '_' . $mon2} + 1 ; if (! in_array("count_${year}_${mon}_${mon2}" , $count_array ) ) { $count_array[] = "count_${year}_${mon}_${mon2}" ; } } sort($count_array); echo "<table border=1>"; foreach ( $count_array as $x) { $d_x = substr($x,-3) . ' ' . substr($x,6,4) ; echo "<tr><td style='text-align:center; vertical-align:middle; padding: 15px;'>$d_x</td><td style='text-align:center; vertical-align:middle; padding: 15px;'>${$x}</td></tr>"; $total = $total + $$x ; } echo "<tr><td style='text-align:center; vertical-align:middle; padding: 15px;'>Total</td><td style='text-align:center; vertical-align:middle; padding: 15px;'>$total</td></tr></table>"; ?>
预期输出示例
May 2024 8852 Jun 2024 14108 Jul 2024 15965 Aug 2024 18139 Sep 2024 13920 Oct 2024 14625 Nov 2024 17029 Dec 2024 39909 Total 142547
我曾尝试使用ls -ltr但无法完成循环与解析,现寻求高效优化方案。
内容的提问来源于stack exchange,提问作者huz_akh
相关产品推荐
相关产品推荐

