Arrays Speichern / Laden optimieren

Cusco

Erfahrenes Mitglied
Hi,

wie können folgende Routinen zum Speichern und Laden Optimiert werden, es ist ein Teil eines Bannerwechselskripts. Es geht mir darum die Zugriffsgeschwindigkeit zu erhöhen und den Server dadurch zu entlasten. Teilweise kam es schon zu Problemen wenn viele User auf einmal gesurft haben. Es wäre ausserdem von nöten das die Datei im Text-Editor von Windows nachbearbeitet werden kann.

Laden:
Code:
   $datei = fopen($bannerpath, "r");
    if($datei)
    {
       $res = flock ($datei, LOCK_SH);
       $n=TRUE;
       for($t=0;$n==TRUE;$t++)
       {
          $url = str_replace("\r\n","",fgets($datei,300));

          $n=FALSE;
          if((strcmp($url,"*ende*")!=0) && (strcmp($url,"")!=0))
          {
            $n=TRUE;
            $urlliste[]=$url;
            $bannerliste[] = str_replace("\r\n","",fgets($datei,300));
            $zeit[] = str_replace("\r\n","",fgets($datei,300));
            $viewdatum[] = str_replace("\r\n","",fgets($datei,300));
            $maxviews[] = (int) fgets($datei,20);
            $viewcounter[] = (int) fgets($datei,20);
            $klickcounter[] = (int) fgets($datei,20);
          }
       }
       flock ($datei, LOCK_UN);
       fclose ($datei);
    }

Speichern:
Code:
       $datei = fopen($bannerpath, "w");
       if($datei)
       {
          flock ($datei, LOCK_EX);
          $anzahl = count($urlliste);
          for($t=0;$t<$anzahl;$t++)
          {
               fwrite($datei,$urlliste[$t]."\r\n");
               fwrite($datei,$bannerliste[$t]."\r\n");
               fwrite($datei,$zeit[$t]."\r\n");
               fwrite($datei,$viewdatum[$t]."\r\n");
               fwrite($datei,$maxviews[$t]."\r\n");
               fwrite($datei,$viewcounter[$t]."\r\n");
               fwrite($datei,$klickcounter[$t]."\r\n");
          }
          fwrite($datei,"*ende*");
          flock ($datei, LOCK_UN);
          fclose ($datei);
       }
 
Zuletzt bearbeitet:
Warum benutzt du [phpf]flock[/phpf]? Beim Schreiben kann ich es ja noch verstehen, aber der Sinn es beim Lesen einzusetzen, ergibt sich mir nicht ganz.

Schonmal dran gedacht die PHP5 Funktionen für Dateioperationen zu benutzen?

Also erstmal statt deiner Auslesevariante [phpf]file[/phpf] einsetzen, du speicherst ja jeden Eintrag sowieso in eine Zeile.

Dann zum Schreiben [phpf]file_put_contents[/phpf]. Du setzt deinen String vorher zusammen und brauchst dann nur noch einen Zugriff um den großen String dann zu speichern. Außerdem kann file_put_contents() auch mit einem LOCK arbeiten.
 
Warum benutzt du [phpf]flock[/phpf]? Beim Schreiben kann ich es ja noch verstehen, aber der Sinn es beim Lesen einzusetzen, ergibt sich mir nicht ganz.

Schonmal dran gedacht die PHP5 Funktionen für Dateioperationen zu benutzen?

Also erstmal statt deiner Auslesevariante [phpf]file[/phpf] einsetzen, du speicherst ja jeden Eintrag sowieso in eine Zeile.

Dann zum Schreiben [phpf]file_put_contents[/phpf]. Du setzt deinen String vorher zusammen und brauchst dann nur noch einen Zugriff um den großen String dann zu speichern. Außerdem kann file_put_contents() auch mit einem LOCK arbeiten.

das mit flock habe ich aus einen "User online" - Skipt, hmm ok ich versuche jetzt mal was mit File usw umzusetzen.
 
Also erstmal statt deiner Auslesevariante [phpf]file[/phpf] einsetzen, du speicherst ja jeden Eintrag sowieso in eine Zeile.

Ist das besser? Hier die neue Lade Routiene. Fürs Speichern muss ich mir noch was einfallen lassen.

Code:
  $dl = array();
  $dl = file($bannerpath);
  $da = count($dl);
  if($da)
  {
     for($t=0;$t<$da;$t++)
     {
       $urlliste[]=str_replace("\r\n","",$dl[$t]);$t++;
       $bannerliste[] = str_replace("\r\n","",$dl[$t]);$t++;
       $zeit[] = str_replace("\r\n","",$dl[$t]);$t++;
       $viewdatum[] = str_replace("\r\n","",$dl[$t]);$t++;
       $maxviews[] = (int) $dl[$t];$t++;
       $viewcounter[] = (int) $dl[$t];$t++;
       $klickcounter[] = (int) $dl[$t];
     }
  }
  else
  {
     echo "Nicht geladen!";
     exit();
  }
 
Ok und hier die neue Routine zum Speichern:

Code:
    if($maxviews[0]>10)
    {
      $anzahl = count($urlliste);
      $save="";
      for($t=0;$t<$anzahl;$t++)
      {
        $save=$save.$urlliste[$t]."\r\n".$bannerliste[$t]."\r\n".$zeit[$t]."\r\n";
        $save=$save.$viewdatum[$t]."\r\n".$maxviews[$t]."\r\n".$viewcounter[$t]."\r\n";
        $save=$save.$klickcounter[$t]."\r\n";
      }
      $t=file_put_contents($bannerpath, $save);
    }

Ist das jetzt besser oder sogar ok?
 
Ja, das sieht besser aus, hier noch ein paar Schönheitskorrekturen, die den Quelltext (meiner Meinung nach) lesbarer machen.

PHP:
$dl = array();
$dl = file($bannerpath);
$da = count($dl);
if($da)
{
	for($t = 0; $t < $da; $t++)
	{
		$urlliste[] = str_replace("\r\n","",$dl[$t]);
		$bannerliste[] = str_replace("\r\n","",$dl[$t++]);
		$zeit[] = str_replace("\r\n","",$dl[$t++]);
		$viewdatum[] = str_replace("\r\n","",$dl[$t++]);
		$maxviews[] = (int) $dl[$t++];
		$viewcounter[] = (int) $dl[$t++];
		$klickcounter[] = (int) $dl[$t++];
	}
}
else
{
	echo "Nicht geladen!";
	exit();
}

if($maxviews[0]>10)
{
	$anzahl = count($urlliste);
	$save = "";
	for($t=0; $t < $anzahl; $t++)
	{
		$save .= $urlliste[$t]."\r\n".$bannerliste[$t]."\r\n".$zeit[$t]."\r\n";
		$save .= $viewdatum[$t]."\r\n".$maxviews[$t]."\r\n".$viewcounter[$t]."\r\n";
		$save .= $klickcounter[$t]."\r\n";
	}
	$t = file_put_contents($bannerpath, $save); // Warum weißt du das Resultat $t zu? Wird das später noch gebraucht?
}

Ungetestet.
 
der lock war vollkommen gerechtfertigt und MUSS sein! (race conditions)
setze beim auslesen nen shared-lock und beim schreiben nen exclusive-lock

aber warum textdateien? die sind deutlich langsamer als eine datenbank, da würdest du weit mehr performance rausholen
 
der lock war vollkommen gerechtfertigt und MUSS sein! (race conditions)
setze beim auslesen nen shared-lock und beim schreiben nen exclusive-lock

aber warum textdateien? die sind deutlich langsamer als eine datenbank, da würdest du weit mehr performance rausholen

Ich habe nur eine Datenbank in meinen Account die will ich mir für wichtigere Dinge als einen Bannertauschscript aufsparren. Aktuell läuft alles über Textdateien nicht nur das Bannerskript sondern auch viel wichtigere sachen wie täglich aktuallisierte Gold & Silberpreislisten ab 2005, zumal ich mich mit Datenbanken nicht auskenne.

@Felix Jacobi
Danke für deine Hilfe, ich habe tatsächlich das Gefühl als ob das Bannerskript jetzt schneller Läuft, ausserdem habe ich auch die Laderoutine der erwähnten Preislisten darauf umgestellt (gespeichert wird nur 1 mal Täglich aktuell ca 19Kb, 713 Tage, EUR und USD-Preise).
 
Ich habe das laden und Speichern jetzt übrigens auf Simple XML umgerüstet. Frage ist das besser? Ein Nachteil z.B. ist, das die Datei größer wird, aber mir kommt es so vor als ob es wieder schneller ist, warscheinlich weil die Variablenübergabe nicht mehr sein muß, Ausserdem hat sich das Löschen eines Eintrages vereinfacht, nun fehlt mir nur noch die Sortierung, wo ich aber nicht weiß wie ich das anstellen soll -> http://www.tutorials.de/forum/php/294632-simple-xml-sortieren-nach-eintraegen.html
 
Zurück