Ankündigung

Einklappen
Keine Ankündigung bisher.

Zu lange Serverlaufzeit

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

  • Zu lange Serverlaufzeit

    Hallo Php.de Gemeinde!

    ich habe ein Problem mit einer Webanwendung.
    Da sich die Daten die verglichen werden sollen sehr schnell vermehrt haben, läuft der Server nicht immer durch und die Berechnung bzw der Vergleich findet nicht für alle Datensätze statt!

    Es passiert folgendes
    Feld1 | Feld2 | Vergleichtfeld 1 | Vergleichtfeld 2 | Ergebnis des Vergleichs
    2 | 0 2 | 0 | 10

    Also der Wert von Feld1 wird mit dem Vergleichsfeld 1 verglichen genau so wie Feld2 sind beide werte gleich wird in das Ergebnisfeld ein Wert geschrieben
    Insgesamt werden ca 6800 Daten auf diese weise über eine IF Abfrage verglichen. Leider bricht die Abfrage immer wieder ab wie kann ich das Problem lösen? Ideen Vorschläge?

    Eventuell den Vergleich in einem Shellscript laufen lassen ? wenn ja wie?
    oder ich würde gerne auch so eine Lösung umsetzen können wie bei mysqldump dort sind die Datenabfragen Limitiert und das Tool steigert sich langsam an die max lifetime des Servers ran und an die zu bearbeitenden Datensätzte! durch neue Seitenaufrufe wie das allerdings funktioniert weiß ich noch nicht!

    Ich hoffe meine Problem ist verständlich!
    Vielen dank
    Alki


  • #2
    Ähm - das klingt verdächtig nach SQL in Schleife. Warum ist das notwendig? In 95,3% aller Fälle deutet das eher auf Bock im Konzept hin. Und warum speicherst Du überhaupt redundante Daten irgendwo?

    Bitte hol mal etwas weiter aus, und beschreib, was Du da eigentlich treibst.

    Gruß Jens

    Kommentar


    • #3
      Also lassen wir die Katze aus dem Sack!
      Wir haben seit Anfang der Fußballsaison ein eigenes Tippspiel!

      Selber Programmiert und auch ne Betaphase zum testen gehabt alles wunderbar!
      Nur leider hatte wir vorher nicht die Möglichkeit mit 190 Usern zu rechnen die Ihre Daten eingegeben haben die nun verglichen werden sollen.

      Also die Daten sind nicht unbedingt redundante!

      es läuft also wie folgt ab!
      Tabelle a hat die aktuellen Ergebnisse der Fußballspiele Tabelle b die getippten Ergebnisse der Tipper.
      Nun müssen dies miteinander verglichen werden um die Punkte zu vergeben! das heisst die Schleife vergleicht alle 9 Spiele jedes einzelnen Tipper und vergibt dann die Punkte! 10 Punkte bei einem Volltreffer oder aber abweichende Punkte tipp 3:0 Ergebnis 1:0 dann gibt es nur 8 Punkte tipp 8:0 und ergebnis 1:0 dann gibt es minimal 5 Punkte tipp falsch keine punkte!

      und die berechnung bzw der Vergleich dauert länger als die lifetime ist!
      Ich hoffe das war konkreter

      Wir haben ne mysql datenbank und ne php schleife!

      DANKE FÜR DIE SCHNELLE ANTWORT

      Kommentar


      • #4
        Doch sind sie redundant. Auch wenn Du aus mehreren Informationen eine neue Information zurecht aggregierst, hast Du eine Redundanz im System.

        Außerdem sollten die Tipps von 190 Usern Deine Datenbank eigentlich nicht vor ernsthafte Probleme stellen. So wie ich Dein Problem bisher lese, lässt sich das komplette Skript im Cronjob durch einen einzigen View in der Datenbank ersetzen. Je nach Verwendung der Daten aus der schon geschriebenen Tabelle, ist sogar besagter View überflüssig.

        Zeig doch mal her, wie sich die Daten der von Dir o.g. Zieltabelle generieren. Bitte beschreibe außerdem, was danach mit en Daten der o.g. Tabelle passiert.

        Gruß Jens

        Kommentar


        • #5
          der quelltext

          hier einmal der quelltext mit ner beschreibung ich hoffe das sagt dir etwas mehr!
          Vielen dank schon mal!

          PHP-Code:
          <?php
              $alleBenutzer_sql 
          "SELECT benutzerid FROM tippbenutzer";
                      
              
          $alleBenutzer_res mysql_query($alleBenutzer_sql);
              while(
          $alleBenutzer mysql_fetch_array($alleBenutzer_res))
              {
                  
          //FÜR DEN AKTUELLEN SPIELTAG SPIELTAGE
                  
          for($spieltagaktuell=$bundesliga_spieltag;)
                  {
                      
                  
          //TIPPS MIT ERGEBNIS VERGLEICHEN
                      
          $tippbenutzer_sql    =    "SELECT spieltagsid, tippheimmannschaft, tipgastmannschaft, benutzerid FROM tippspieltag WHERE spieltag = '".$spieltagaktuell."' AND saisonjahr = '".$saison."'  AND benutzerid = ".$alleBenutzer['benutzerid']." ";
                      
          $tippbenutzer_res     =    mysql_query($tippbenutzer_sql);
                      
                  
          //TIPPS DER USER WEURDEN AUSGELESEN    
                      
          while($tippbenutzer =     mysql_fetch_array($tippbenutzer_res))
                      {
                          
                          
          $show_erg_sql ="SELECT heimtore,auswaertstore FROM bundesliga_spieltag WHERE spieltag = '".$spieltagaktuell."' AND spieltagsid = '".$tippbenutzer[spieltagsid]."' ";
                          
          //Die Aktuellen Ergebnisse der Bundesliga Werden abgefragt
                          
          $show_erg_res mysql_query($show_erg_sql);
                          
          $show_erg mysql_fetch_array($show_erg_res);

                  
          //PUNKTEBERECHNUNG
                          
          if($show_erg[heimtore] != -&& $show_erg[auswaertstore] != -// WENN DER WERT ungleich -1 ist hat das Spiel stattgefunden
                          
          {        
                              if ((
          $show_erg[heimtore] > $show_erg[auswaertstore]) && ($tippbenutzer[tippheimmannschaft] > $tippbenutzer[tipgastmannschaft]))
                              {    
          $PKT_wertigkeit "heimsieg";    }
                              elseif ((
          $show_erg[heimtore] < $show_erg[auswaertstore]) && ($tippbenutzer[tippheimmannschaft] < $tippbenutzer[tipgastmannschaft]))
                              {    
          $PKT_wertigkeit "auswertssieg";    }
                              elseif ((
          $show_erg[heimtore] == $show_erg[auswaertstore]) && ($tippbenutzer[tippheimmannschaft] == $tippbenutzer[tipgastmannschaft]))
                              {    
          $PKT_wertigkeit "remis";    }
                              else
                              {    
          $PKT_wertigkeit "lose";    }
                          
                  
          //Punkte vergeben
                  
          if($tippbenutzer[tippheimmannschaft] != -&& $tippbenutzer[tipgastmannschaft] != -1// Wenn der Wert ungleich -1 ist hat der User getippt
                  
          {
                      
          // Wenn heimtore ,auswaertstore leer sind  oder die usertipps dann soll es keine punkte geben
                   
          if (($PKT_wertigkeit == "lose") || ($show_erg[heimtore] == "") || ($show_erg[auswaertstore] == "") || ($tippbenutzer[tippheimmannschaft] == "") || ($tippbenutzer[tipgastmannschaft] == ""))
                    {    
          $PUNKTE=0;    }
                      else
                       {    
          $PUNKTE10 abs(abs($show_erg[heimtore] - $tippbenutzer[tippheimmannschaft]) + abs($show_erg[auswaertstore] - $tippbenutzer[tipgastmannschaft]));
                  
          //Mindestpunkte        
                              
          if ( $PUNKTE <5)
                                  {    
          $PUNKTE=5;    }
                          }
                      }
                  }
              
          //PUNKTEBERECHNUNG ENDE
                          
          $Gesamtpunkte $Gesamtpunkte $PUNKTE;
                          
          //echo "-".$PUNKTE." ".$PKT_wertigkeit;
                          
                          
          $date date("YmdHis");
                      
          //In die Datenbank eintragen
                          
          $update_spieltag_sql =     'UPDATE tippspieltag SET tipppunkte ="'.$PUNKTE.'" , aenderung = NOW() WHERE spieltag = '.$spieltagaktuell.
                                                  AND benutzerid ='
          .$tippbenutzer[benutzerid].' AND spieltagsid = '.$tippbenutzer[spieltagsid].' ';    
                          
          $update_spieltag_res mysql_query($update_spieltag_sql);
                          
                      unset(
          $PUNKTE);
                      
                      }
          //ENDE WHILE tippbenutzer TIPPS MIT ERGEBNIS VERGLEICHEN
                      
                          
                      //In die Datenbank eintragen
                      
          $gesamptpunkte_einfuegen "INSERT INTO ges_pkt_spieltag (benutzerid, saisonjahr, spieltag, pkt_spieltag) 
                                        VALUES ('"
          .$alleBenutzer['benutzerid']."' , '".$saison."' , '".$spieltagaktuell."', '".$Gesamtpunkte."')";
                      
          $gesamptpunkte_einfuegen_res mysql_query($gesamptpunkte_einfuegen);
                          
                          if(
          $gesamptpunkte_einfuegen_res != 1)
                          {
                          
          $aktuallisiere_gesamt_punkte "    UPDATE ges_pkt_spieltag SET pkt_spieltag = '".$Gesamtpunkte."'  WHERE benutzerid ='".$alleBenutzer['benutzerid']."' 
                                              AND spieltag ='"
          .$spieltagaktuell."' AND saisonjahr = '".$saison."' ";
                          
          $make_update mysql_query($aktuallisiere_gesamt_punkte);
                          }
                  
                      unset(
          $Gesamtpunkte);
                      
                  }
          //ENDE FOR SCHLEIFE ALLE SPIELTAGE
              
          }//ENDE WHILE ALLE USER
              
          unset($alleBenutzer_sql);
          ?>
          Ich Stimme dir auch zu was die Datenbank angeht da die SQL befehle für 5000 datensätze in 0,7 Sekunden ausgeführt werden!

          Kommentar


          • #6
            Autsch, sogar Anfragen in einer dreifach verschachtelten Schleife. Das ist echt übel. Bitte unbedingt mit Datenbankthemen beschäftigen, den Abfragen werden nicht einzeln gemacht, sondern gruppenweise für bestimmte Kriterien und dann entsprechend ausgewertet.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Okay das das nicht unbedingt das gelbe vom ei ist hab ich mir fast gedacht! es war aber bis dato mittel zum zweck! hättest du eventuell einen tipp wie ich es besser machen könnte?
              Weil ich mir unter einer gruppenweisen abfrage nichts vorstellen kann!

              Vielen Dank!

              Kommentar


              • #8
                @nikosch: Meinst Du nicht, der Thread wäre in Datenbanken besser aufgehoben? PHP Fortgeschritten ist das jedenfalls nicht.

                @alktester: Als allererstes verabschiede Dich mal vollständig von Deinem Skript. Danach liest Du bitte eine Einführung ins Thema SQL-Joins (diese hier ist z.B. nicht die schlechteste), und versuchst dann im ersten Schritt eine Abfrage zu erstellen, die Dir alle Deine Drei Selects in einem vereinigt.

                Darauf kannst Du dann aufbauen und die Punkte pro Spieltag und Nutzer ebenfalls direkt in einer einzigen SQL-Query berechnet und zurück liefert. (Lesestoff dazu) Wenn Du diese Query hast, dann beschäftigst Du Dich mit dem Thema Indizees (Lesestoff) und optimierst Deine Query auf Performance hin.

                Das Ergebnis dieser Query - so wirst Du feststellen - ersetzt Deine Tabelle tippspieltag. Bei jedem Zugriff auf diese Tabelle in Deinen anderen Skripten kannst Du jetzt entsprechende Veränderungen einpflegen.

                Wenn Du das durch hast, nimmst Du Dir ges_pkt_spieltag vor - die Tabelle ist nämlich mit hoher Wahrscheinlichkeit ebenfalls überflüssig.

                Gute Lektüre im Vorfeld vielleicht noch: Datenbanken entwickeln

                Gruß Jens

                Kommentar


                • #9
                  Danke Jens! habe mir schon gedanken zu den Joins gemacht viele andere Anwendungen haben wir später Programmiert wo wir auch Joins verwendet haben! Wie es ja immer so schön heisst never change a running system! aber wir gehen es jetzt wieder an da es eben nicht 100%ig läuft!
                  Da es nur ein HobbyProjekt ist haben wir nicht immer so viel zeit und wollten uns einfach mal guten Rat holen den haben wir auf jedenfall gefunden!

                  Wir optimieren jetzt erstmal das Script! Ich denke aber das wir nicht auf die tabelle tippspieltag verzichten können weil da stehen ja die tipps der user drin! also jeder gibt ja seinen tipp ab! dieser muss ja hinterlegt werden da jeder user je spieltag 9 begegnungen tippen kann! um nachhaltig zu sein und jeden einzelnen spieltag nachzuvollziehen brauchen wir diese tabelle wo dann auch die punkte drin stehen!
                  wo sollen diese denn sonst gespeichert werden?

                  Gruß Basti

                  Kommentar


                  • #10
                    gruppenweisen abfrage
                    Vielleicht bissel blöd formuliert.

                    Code:
                    SELECT id, spieler FROM xy
                    while ($set = musql_fetch_* ()) {
                      // do actions here
                    }
                    
                    vs. (umständlich und inperformant):
                    
                    SELECT id FROM xy 
                    while ($data = musql_fetch_* ()) {
                    
                      SELECT spieler FROM xy WHERE id = $data[id]
                      while ($set = musql_fetch_* ()) {
                        // do actions here
                      }
                    }
                    Meinst Du nicht
                    Ja.

                    [MOD: verschoben]
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Stimmt, speichern musst Du Deine Tipps - da hab ich oben nicht weit genug nach rechts geschaut & das in Deiner zweiten Query übersehen. tipppunkte darin ist aber definitiv überflüssig.

                      Vom reinen Aufbau her solltest Du die Punkte nicht zwingend irgendwo speichern müssen. Aber selbst wenn Du das machst, dann kann das durchaus in Form eines Triggers "OnInsert" bei den Spielergebnissen passieren. So oder so ist Dein Cronjob nicht notwendig.

                      (Wobei es ohne konkrete Infos über Euren bisherigen Aufbau ziemlich schwierig ist, irgendwelche Verbesserungsvorschläge zu machen - genieß das was ich hier sage also ein wenig mit Vorsicht)

                      Gruß Jens

                      Kommentar

                      Lädt...
                      X