You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:40:02