Script optimieren

  • Themenstarter Themenstarter Lukasz
  • Beginndatum Beginndatum
L

Lukasz

Script optimieren Datenbanken automatisch repairieren

Hallo

ich habe folgenden Script, welchen ich jetzt noch optimieren möchte! Der Script macht keinerlei Probleme, aber ich möchte das ganze in eine Schleife setzen, und mindestens 5 mal durchlaufen lassen -> Siehe //## Prozess wiederholen, falls noch fehler autacuhen. Das ganze in eine Schleife zu setzten ist zwar kein Problem, aber wie könnte ich leistungstechnisch alle Felder abfragen, ob irgend ein warning oder fehler vorhanden ist?

Datenbanken automatisch reparieren und optimieren
PHP:
<?
//## Variablen
$fehler = 0;
$nofehler = 0;
$ges = 0;

//## ignore_user_abort() senden, damit Script automatisch abgearbeitet wird ##
ignore_user_abort();

//## Alle Tabellen aus der Datenbank auslesen und im String vermerken: ##
global $lgckit_mysqldb;
$result = mysql_list_tables($lgckit_mysqldb);
while($row = mysql_fetch_array($result)){
$tables .= $row['0'].", ";
}

//## SQL FEHLER :extended check error Table 'lgckit.extended' doesn't exist##
//## Verhindern, das letzte komma (,) entfernen ##
for($i=0;$i<strlen($tables)-2;$i++){
$alltables .= $tables["$i"];
}
unset($tables,$result);

//## Tabellen pruefen  bei 100% Datensaetze u. voller Indzies ##
//#INFO# Mysql liefert 4 assoc Werte: Table - Op - Msg_type - Msg_text ##
//#INFO# Msg-text liefert 'OK' sofern Msg-type nicht 'warning'oder 'error' beinhaltet.##
//#INFO# wird einer dieser Werte geliefert, bleibt Msg_text leer##
//#INFO# anders herum liefert Msg_type den Wert 'status' sofern Msg_text 'OK' zurueck gibt##
//## liefert Msg_type 'error' wird die DB nur rpairiert + A##
//## liefert Msg_type 'warning' wird nur optimiert + B##
$result = @mysql_query("CHECK TABLE ".$alltables." EXTENDED");
while($row = @mysql_fetch_array($result)){
if ($row['Msg_type'] == "error") { @mysql_query("REPAIR TABLE ".ereg_replace("$lgckit_mysqldb\.","",$row["Table"])." EXTENDED"); $fehler++; }
elseif ($row['Msg_type'] == "warning") { @mysql_query("OPTIMIZE TABLE ".ereg_replace("$lgckit_mysqldb\.","",$row["Table"]).""); $fehler++; }
$ges ++;
}

//## Prozess wiederholen und Ergebnise ausgeben ##
$result = @mysql_query("CHECK TABLE ".$alltables." EXTENDED");
while($row = @mysql_fetch_array($result)){
if ($row['Msg_type'] == "error") { echo ereg_replace("$lgckit_mysqldb\.","",$row["Table"])." Fehler<br>"; }
elseif ($row['Msg_type'] == "warning") { echo ereg_replace("$lgckit_mysqldb\.","",$row["Table"])." Warnung<br>"; }
elseif ($row['Msg_type'] == "status" or $row['Msg_text'] == "OK") { echo ereg_replace("$lgckit_mysqldb\.","",$row["Table"])." OK<br>"; $nofehler++; }
}
echo $fehler." Fehler gefunden, davon ".($ges - $nofehler)." behoben";

//## Eintrag in die Mysql-Datenbank letzter optimierungszeitpunkt ##
@mysql_query("UPDATE lgckit_settings SET settings_lastdbotimizetime = '".sqldatetime(time())."' LIMIT 1");
?>

Danke!

PS Ich möchte einfach den Script solange ausführen, bis endweder keine Fehler mehr autauchen, oder aber der Script 5 mal abgearbeitet worden ist. Aber ich möchte auf Grund des Benchmarks in einer einzigen abfrage checken ob über haupt ein Fehler vorhanden ist, bevor die Schleife weitergeführt wird.

Hier noch interne Funktionen:
PHP:
//## Rechnet timsestamp in MYSQL DATE-TIME um ##
if (!function_exists("sqldatetime")) {
function sqldatetime($datum)
{
$stream .=strftime("%Y",$datum)."-";
$stream .=strftime("%m",$datum)."-";
$stream .=strftime("%d",$datum)." ";
$stream .=strftime("%H",$datum).":";
$stream .=strftime("%M",$datum).":";
$stream .=strftime("%S",$datum);
return $stream;
}
}

Gruss!
 
Zuletzt bearbeitet von einem Moderator:
Merk dir doch bei jedem Schleifendurchlauf die Tabellen, die einen Fehler aufwiesen. Beim nächsten Durchgang überprüfst du nur noch diese Tabellen (usw). Somit reduziert sich die Anzahl zu prüfender Tabellen mit jedem Schleifendurchlauf.

P.S.: Deine Methode die letzten zwei Zeichen eines Strings abzuschneiden ist echt übel. Wie wär's damit:
PHP:
$text = substr($text, 0, -2);
?

Sven
 
[phpf]strftime[/phpf] kann man meines Wissens abkürzen:
PHP:
return strftime("%Y-%m-%d %H:M:S",$datum);
Ob das wirklich schneller ist musst Du allerdings testen. Ich denke, minimal schneller wird es sein.
 
@snuu

Ich habe auch schon daran gedacht den Haupteil in einer Funktion zu wandeln, und alle Tables die deffekt sind, würde ich einfach als String übergeben. Aber da bliebe noch die echo Quote übrig!

Das wichtigste ist eben, der Anwender der später einst mein Webkit saugt, möchte wissen welche DB kapputt waren und welche repairiert wurden, dacher ist das auch nicht so ganz einfach.

Der Script geht zwar sehr schnell ab, aber mit der Schleife zieht sich das. Warum ich das überhaupt mach? - Weil ich schon bereits in der Plattform 1 Wiederherstellungspunkte verarbeitet habe. Nun will ich aber wisse, oder mich vergewissern, dass alle Tables Den Status OK tragen, bevor ich einen export starte. Dacher genau der Script. Nun will ich eben, dass der User auch sieht wo eventuell der Manuell anlegen muss, bevor ein neuer Widerherstellungspunkt ausgeführt wird.

Warum ignore_user_abort() -> Dieser Code sorgt dafür, dass der Code in jedem Fall bis zum ende ausgeführt wird.

Denn die widerherstellungspunkte, sollen in dieser Version auch automatisch ausgeführt werden. D.h der Webamster gibt ein Beispielweise täglich. So rufe ich den Script bei irgend einem User ab, zum bestimmten Zeitpunkt.

So nun durchlaufe ich die Schleife, und möchte dem Webmmaster hinterlegen, warum ein Widerherstellungspunkt nicht angelegt wurde.

Ich denke eher an break; oder continue; weis aber noch nicht wie!
Ntürlich kann mann sagen, dass es Schwachsinn ist den Code 5 mal abzuarbeiten. Aber erfahrungen sagen mir, dass manche Tables den Status optmiere mich tragen, danach tragen sie deffekt und danach wieder optimieren, bevor sie OK anzeigen. Genau dies hinterlegt das nächste Problem, denn eine Tabelle kann nach optimieren deffekt sein, oder aber auch anderst herum! Aus diesem Grund habe ich den Script ersteinaml einfach eingegeben, und warte auch weitere Ideen!

Danke aber auch schon mal für deine Hilfe!

@hpvw
hast natürlich Recht, die Funktion habe ich auf die schnelle geschrieben! Danke!

PS vieleicht probiert das einer bei sich
1.Funktion sqldateime() einbauen oder unten Update weg!
2. Script in eine Funktion legen
3. Variable $lgckit_mysqldb = Datenbankname vermerken!
evetl, hat einer von euch eine Idee!
 
Zuletzt bearbeitet von einem Moderator:
Zurück