Laufzeit meiner "Wochenansicht" zu groß

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Laufzeit meiner "Wochenansicht" zu groß

    Hallo liebe PHP-Resource-Gemeinde,

    ich bin gerade dabei für mich und meine Freunde einen Kalender zu programmieren, der auch unsere Verfügbarkeit unter der Woche visualisieren soll (siehe Bild)




    Leider sind die Laufzeiten meines Scripts sehr schlecht (im Schnitt 5,5 Sekunden). Nun hoffe ich, daß Ihr mir einen kleinen Anstoß geben könnt, damit die Seiten schneller ausgeliefert werden....

    hier mein bisheriger Code (für die Lesbarkeit ein bißchen abgespeckt)

    PHP-Code:
    // array $user wurde bereits erzeugt in der Form:
    // $user[X]['id'] = userID
    // $user[X]['color'] = Farbe des Users

    // Start aktuelle Wochenansicht:

    // gehe alle Tage durch
    for ($d 1$d 8$d++) {
        echo 
    '<table>';
        
    // gehe einzelne Stunden durch (7 bis 24 Uhr)
        
    for ($h 7$h 24$h++) {
            
    //gehe alles im viertel Stundentakt durch
            
    for ($m 0$m 4$m++) {
                echo 
    '<tr>';
                
    $fromtimestamp get_fromtimestamp(time(), $d$h$m);
                
    $untilltimestamp $fromtimestamp + (15*60);
                
    // gehe jeden einzelnen User durch der ne Farbe hat ...
                
    for ($u=0$u count($users); $u++) {
                    
    // schaut in DB nach, ob es zum aktuellen Zeitpunkt für den aktuellen User ein Eintrag hat:
                    
    $mysql "select * from `kom_calendar` WHERE .... (etwas länger, aber funktioniert)"
                    
    $result mysql_db_query($db_name$mysql);
                    if (
    mysql_num_rows($result)> 0
                        echo 
    '<td bgcolor="'.$users[$u]['color'].'">&nbsp;</td>';
                    else 
                        echo 
    '<td>&nbsp;</td>';
                }
                echo 
    '</tr>';
            }    
        }
        echo 
    '</table>';

    PHP-Code:
    // mysql Anfragestring:
    $mysql "select * from `enbit_kom_calendar` WHERE 
                   (`fromtime` > '"
    .($fromtimestamp-1)."' AND `fromtime` < '".($untilltimestamp+1)."') OR 
                   (`untilltime` > '"
    .($fromtimestamp-1)."' AND `untilltime` < '".($untilltimestamp+1)."') OR 
                   (`fromtime` < '"
    .($fromtimestamp+1)."' AND `untilltime` > '".($untilltimestamp-1)."') AND 
                   `participants` LIKE '%"
    .$users[$u]['user']."%'"

    Schon mal vielen Dank für Eure Hilfe!

    Schöne Grüße,
    Matthias

  • #2
    Hi,

    ich würde so vorgehen:

    1. Mache ein SQL-Abfrage für den gesamten Tag! Zähle dabei die Anzahl der verschiedenen Benutzer, damit die die Spaltenzahl pro Tag herausfindest

    2. Gehe die MySQL-Abfragen nacheinander durch und speichere die <td>s in Variablen, die immer erweitert werden

    3. Diese Variablen gehst du jetzt durch un prüfst, ob die Anzahl der TDs mit der Benutzeranzahl für den Tag übereinstimmt. Wenn nicht, füge noch <td>s hinzu!

    4. Den Variablen hast du als Namen die Zeiten gegeben! Daher kannst du jetzt durch einfaches Einfügen eines Tages-Templates, welches die Variablen beinhaltet dir den kompletten Tag zusammensetzen lassen und ausgeben

    Die leeren Variablen musst du natürlich mit einem TD + evtl. Colspan auffüllen

    =====================================

    Unterm Strich hast du dann nur eine MySQL-Abfrage und weniger Schleifen, weshalb es schneller ablaufen sollte



    best regards
    Piremilok

    Kommentar


    • #3
      Hey Piremilok,

      Danke für Deine Tips. Bin gerade am Ausprobieren und Umsetzen. Schon Deine 2. Anregung hat die Laufzeit auf 2,6 Sekunden gebracht. Spitze!

      bleibe dran....

      Schöne Grüße,
      Matthias

      Kommentar


      • #4
        Hi,

        dabei habe ich mich bei der 2. Anregung verschrieben:

        1. Mache eine MySQL-Abfrage für alle Daten
        2. Werte alle Ergebnisse aus und speichere sie in Variablen

        So meinte ich das!
        Aber freut mich, dass es dir so auch schon etwas gebracht hat

        Kommentar


        • #5
          Genereller Tipp:
          SQL-Abfrage in Schleifen sind oft sehr ungesund. Wenn du kannst selecte dein komplettes Ergebnis und durchlaufe dann das Ergebnis

          Kommentar


          • #6
            sag ich doch...

            Kommentar


            • #7
              ich bin gerade dabei für mich und meine Freunde einen Kalender zu programmieren, der auch unsere Verfügbarkeit unter der Woche visualisieren soll (siehe Bild)
              Cool, sieht aus wie Tetris!

              Kommentar


              • #8
                tach

                1. Eine Variable als Array Deklarieren
                2. Das Array() mit leeren <td> & n b s p ;</td> füllen
                (z.B. $KALENDER[2/*Tag*/][3/*Stunde*/][4/*Benutzer*/] = "<td>& n b s p ;</td>" )
                so füllen, dass wenn du das array wieder auswertest, eine leere Übersicht über die Woche hast
                (auch die Farben der User in ein extra Array hauen)
                3. Jetzt nur 1 MySQL Abfrage starten die alle einträge der Woche ließt
                4. dann mit while() + z.B. mysql_fetch_assoc durchlaufen und jeweils den Eintrag im array ersetzen
                (z.B. $KALENDER[2/*Tag*/][3/*Stunde*/][4/*Benutzer*/] = "<td bgcolor=\"{$DAS_FARBEN_ARRAY}\">& n b s p ;</td>")
                5. und zum schluss alles ausgeben

                (ist nur ein Vorschlag, wie ich es verwirklichen würde)

                gruß SuRaXor

                Kommentar

                Lädt...
                X