首页 > 解决方案 > 加速 PHP 脚本

问题描述

我正在为我的办公室制定日历。每个人都有自己的专栏,每天都有一条线。

有一些定期日期,例如,考虑到人们必须在周末工作。但大多数日期都来自 MySQL 数据库。

所以它做了一个双重循环(人与日期),其中每个日期都必须检查这个人,他在这一天有什么样的职业。

有没有办法优化这个脚本,因为在线上至少需要2-3秒(根据PHP只有0.03秒,但我觉得它不正确)和超过8秒(再次根据PHP)在我们的网络!这只是 5 个月,我们想拥有它一整年。

您可以在此处找到测试版本(仅查看 HTML 和 CSS): http: //mybees.ch/for/tableau.php

这是其中的PHP:

//Creating the line for the collaborators
$ids;
$ma_count=0;
$ma_name_query = mysqli_query($bdi,"SELECT DISTINCT m.id, m.name, m.vorname, m.grup FROM ma m, ma_pos mp WHERE m.id = mp.maid AND m.grup != 14 ORDER BY m.grup, mp.posid, m.name, m.vorname");
while($ma_name = mysqli_fetch_assoc($ma_name_query)) {
    echo '<div class="cell name">'.$ma_name['name'].' '.$ma_name['vorname'].'</div>';
    $ids[$ma_count] = $ma_name['id'];
    $grup[$ma_count] = $ma_name['grup'];
    $ma_count++;
}
// Check if special group day
$firstGroup = 1;
$firstDate = strtotime("$year-01-01 00:00 GMT");
$picket = array();

if (date("N", $firstDate) ==  2)// Tuesday
    $firstDate -= 24 * 3600;
elseif (date("N", $firstDate) ==  3)// Wednesday
    $firstDate -= 2 * 24 * 3600;
elseif (date("N", $firstDate) ==  5)// Friday
    $firstDate -= 24 * 3600;
elseif (date("N", $firstDate) ==  6)// Saturday
    $firstDate -= 2 * 24 * 3600;
elseif (date("N", $firstDate) ==  7)// Sunday
    $firstDate -= 3 * 24 * 3600;

for ($date = $firstDate; $date <= strtotime("$year-12-31 00:00 GMT"); $date += 24 * 3600) {
    $weekNb = date("W",$date);
    $weekDay = date("N",$date); // Monday = 1, Sunday = 7
    if ($weekDay < 4)
        $group = $weekNb % 4 - 1 + $firstGroup;
    else
        $group = $weekNb % 4 - 2 + $firstGroup;
    
    if ($group == 0)
        $group = 4;
    if ($group == -1)
        $group = 3;
    
    $picket[$date] = $group;
}

$groupColor = ["yellow", "blue", "red", "green"];

function isPicket($date, $grup) {
    global $picket, $groupColor;
    //global $picket, $groupColor;
    if ($grup < 5) {
        if ($picket[$date] == $grup)
            return " style='background-color: ".$groupColor[$picket[$date]-1]."'";
    }
}
$today_stp = time() - time() % (24 * 3600) - 11 * 24 * 3600;
$frei_query_text = "SELECT id_ma, date1, date2, free.id as type, moment, remark, location FROM frei, free WHERE free.id = frei.type AND date1 BETWEEN CAST('$date1' AS DATE) AND CAST('$date2' AS DATE)";
$frei_query = mysqli_query($bdi, $frei_query_text);
$free = array();
while($frei = mysqli_fetch_assoc($frei_query)) {
    $free[] = $frei;
}

// Filling the lines
for ($date = strtotime($date1); $date <= strtotime($date2); $date += 24 * 3600) {
    $today = ($date == $today_stp) ?  ' id="today"':'';
    echo "<div class='clear'$today>";
    $class = (date('N', $date) < 6) ? 'week' : 'weekend';

    echo "<div class='date $class line'>".date("D, d.m.", $date)."</div>";
    
    for ($i = 0; $i < $ma_count; $i++) {
        
        echo "<div class='cell line $class'".isPicket($date,$grup[$i]).">
            <div class='small-cell".isColor($ids[$i], $date, 0)."' id='divUp-".$ids[$i]."-$date'>&nbsp;</div>
            <div class='small-cell".isColor($ids[$i], $date, 1)."' id='divDown-".$ids[$i]."-$date'>&nbsp;</div>
        </div>";
    }

    echo '</div>';
}

function isColor($id_ma, $date, $moment) {
    global $free;

    for ($i = 0; $i < count($free); $i++) {
        if ($id_ma == $free[$i]['id_ma']) {
            if ($date >= strtotime($free[$i]['date1']) && $date <= strtotime($free[$i]['date2'])) {
                if ($free[$i]['moment'] == $moment || $free[$i]['moment'] == 2) {
                    $type = $free[$i]['type'];
                    $style = "";
                    
                    if ($type > 1 && $type < 5)
                        $style = " urlaub";
                    if ($type > 4 && $type < 8)
                        $style = " frei";
                    if ($type > 7 && $type < 11)
                        $style = " ferien";
                    if (($type > 22 && $type < 34) || ($type > 37 && $type < 48))
                        $style = " kurse";
                    if ($type > 10 && $type < 17)
                        $style = " krank";
                    
                    return " $style' title='".$free[$i]['remark'];
                }
            }
        }
    }
}

非常感谢您的帮助

标签: phpmysqldatecalendar

解决方案


推荐阅读