Sprint
Erfahrenes Mitglied
Hallo zusammen,
ich bin gerade dabei, ein Programm zu schreiben um einige hunderttausend Dateien zu verschlüsseln. Nun ist das Problem, daß das Script MANCHMAL ins Stolpern gerät und teilweise totalen Mist produziert und manchmal fehlerfrei durchläuft.
Zum Ablauf: Zuerst werden in eine Tabelle aller vorhandenen Dateien geschrieben. Dabei werden ungültige Dateinamen bereinigt und die neuen Namen ebenfalls in die Tabelle eingetragen. Nun geht das Script die Tabelle durch, nimmt eine Datei, verschlüsselt sie und entschlüsselt sie anschließend in eine temporäre Datei, um mittels SHA1 Prüfsummen die korrekte Verschlüsselung zu prüfen. Wenn korrekt, wird die Prüfsumme in eine separate Tabelle eingetragen, der ursprüngliche Datensatz als erledigt gekennzeichnet und die offene Datei gelöscht. Wenn die Verschlüsselung fehlgeschlagen ist, werden insgesamt drei Versuche gestartet, bevor der Eintrag entsprechend gekennzeichnet wird und der nächste Datensatz aufgerufen wird.
Theoretisch für mich ein einfacher und normalerweise problemloser Ablauf. Doch jetzt kommt das Problem. Es KANN passieren, daß das Script sich scheinbar selbst überholt. Dann wird eine Datei korrekt verarbeitet, dann aber nochmal aufgerufen. Blöd bei dieser Situation ist, daß dann sowohl Ausgangsdatei als auch verschlüsselte Datei gelöscht sind. Oder es wird drei Mal verkehrt verschlüsselt, dann aber die Datei nochmal aufgerufen und dieses mal korrekt verschlüsselt.
Merkwürdig ist auch, daß Datensätze erneut aufgerufen werden, obwohl sie bereits als verarbeitet gekennzeichnet wurden. Eben als ob das Script mehrfach laufen würde und sich gegenseitig überholt. Zeitweise geht es gut und zeitweise eben nicht. Dafür würde auch sprechen, daß die Fehler nicht konstant durchgehen, sondern zwischendrin auch wieder hunderte und tausende Dateien korrekt im ersten Lauf verschlüsselt werden. Das Programm wird aber nicht mehrfach gestartet.
Es kann aber auch sein, daß eine Stunde später der selbe Lauf mit den exakt selben Dateien ohne einen einzigen Fehler durchläuft.
Ich hatte auch schon die Überlegung, daß es an der Sortierung der Datensätze liegen könnte. Ich lasse sie nach Kundennummern sortiert laufen, um nicht ständig den individuellen Schlüssel auslesen zu müssen. Könnte das das Problem sein? Wäre es besser, die Reihenfolge mit Zufallszahlen durcheinander zu bringen um das Script damit einzubremsen?
Auch mit dem Support unseres Providers bin ich die Sache schon ein paar mal durchgegangen. Er hat an ein paar Servereinstellungen gedreht, was aber auch nichts gebracht hat.
Im Moment sind es nur kleine Testläufe mit 30- 50000 Dateien. Nur wenn es dann mal soweit ist und die originalen Dateien drankommen, dann darf es keine Fehler geben. Aus Platzgründen kann ich die rund 200 GB an Daten nicht aufheben bis alles erledigt ist. Ich muß die nach Verarbeitung löschen.
Hat jemand eine Idee, wie das Programm optimiert werden kann oder so eingebremst, daß es nicht ins stolpern kommt? Beim zeitlichen Rahmen ist noch Luft. Die rund 200000 Dateien brauchen zum verschlüsseln geschätzt 4-5 Stunden, wenn es also etwas länger dauert, wäre das nicht das Problem. Es muß nur innerhalb eines Tages durchgelaufen sein.
Vielen Dank schon mal im Voraus,
Sprint
ich bin gerade dabei, ein Programm zu schreiben um einige hunderttausend Dateien zu verschlüsseln. Nun ist das Problem, daß das Script MANCHMAL ins Stolpern gerät und teilweise totalen Mist produziert und manchmal fehlerfrei durchläuft.
Zum Ablauf: Zuerst werden in eine Tabelle aller vorhandenen Dateien geschrieben. Dabei werden ungültige Dateinamen bereinigt und die neuen Namen ebenfalls in die Tabelle eingetragen. Nun geht das Script die Tabelle durch, nimmt eine Datei, verschlüsselt sie und entschlüsselt sie anschließend in eine temporäre Datei, um mittels SHA1 Prüfsummen die korrekte Verschlüsselung zu prüfen. Wenn korrekt, wird die Prüfsumme in eine separate Tabelle eingetragen, der ursprüngliche Datensatz als erledigt gekennzeichnet und die offene Datei gelöscht. Wenn die Verschlüsselung fehlgeschlagen ist, werden insgesamt drei Versuche gestartet, bevor der Eintrag entsprechend gekennzeichnet wird und der nächste Datensatz aufgerufen wird.
PHP:
$anfang = time();
$kmerker = '';
$sql = "select * from encfiles where erledigt = 0 order by kdnr";
$erg = mysqli_query($mysqli, $sql); //Datanbankanfrage senden
if (!$erg)
die('<font color="red">Datenbankfehler: '.__FILE__.' Zeile '.__LINE__);
$fp = fopen('errorlog.txt', 'a');
while ($zeile = mysqli_fetch_array($erg, MYSQLI_ASSOC)){
if ($kmerker != $zeile['kdnr']){
$kmerker = $zeile['kdnr'];
$sqlc = "select k1, k2 from kunden where kdnr = '".$zeile['kdnr']."'";
$ergc = mysqli_query($mysqli, $sqlc); //Datanbankanfrage senden
$zeilec = mysqli_fetch_array($ergc, MYSQLI_ASSOC);
$key1 = secured_decrypt_data($zeilec['k1'], '', '');
$key2 = secured_decrypt_data($zeilec['k2'], '', '');
}
$pathparts = pathinfo($zeile['neuname']);
$upname = $pathparts['dirname'].'/'.strtoupper($pathparts['basename']);
$neuname = $upname.'.enc';
$orgsha = sha1_file($zeile['datei']);
$verschluesselt = false;
$versuche = 0;
while (!$verschluesselt && $versuche < 3){
if (file_exists($zeile['datei'])){
$enc_file = encryptFile($zeile['datei'], $key2, $neuname);
decryptFile($neuname, $key2, 'temp/testfile.nix');
$decsha = sha1_file('temp/testfile.nix');
if ($orgsha == $decsha){
$sqlw = "update encfiles set erledigt = 1 where lnr = '".$zeile['lnr']."';";
$ergw = mysqli_query($mysqli, $sqlw);
$sqlw = "insert into filesha (datei, sha) value ('$upname', '$orgsha')";
$ergw = mysqli_query($mysqli, $sqlw);
fwrite($fp, date('H:i:s')."\t".$orgsha."\t".$decsha."\t".$zeile['datei']."\t ok \r\n");
unlink($zeile['datei']);
unlink('temp/testfile.nix');
$verschluesselt = true;
}else{
if ($orgsha == '')
$orgsha = "\t\t\t\t\t";
if ($decsha == '')
$decsha = "\t\t\t\t\t";
fwrite($fp, date('H:i:s')."\t".$orgsha."\t".$decsha."\t".$zeile['datei']."\t fehler \r\n");
unlink($neuname);
unlink('/var/www/vhosts/herpolsheimer.ag/pruefung.herpolsheimer.ag/temp/testfile.nix');
if (time() - $anfang > 110){
fclose($fp);
die();
}
$versuche++;
}
}else{
fwrite($fp, date('H:i:s')."\t\t\t\t\t\t\t\t\t\t\t\t\t".$zeile['datei']."\t Datei fehlt \r\n");
$sqlw = "update encfiles set erledigt = 3 where lnr = '".$zeile['lnr']."';";
$ergw = mysqli_query($mysqli, $sqlw);
$verschluesselt = true;
}
}
if (!$verschluesselt && $versuche == 3){
fwrite($fp, date('H:i:s')."\t".$orgsha."\t".$decsha."\t".$zeile['datei']."\t abbruch \r\n");
$sqlw = "update encfiles set erledigt = 2 where lnr = '".$zeile['lnr']."';";
$ergw = mysqli_query($mysqli, $sqlw);
unlink('temp/testfile.nix');
}
if (time() - $anfang > 110){
fclose($fp);
die();
}
}
Theoretisch für mich ein einfacher und normalerweise problemloser Ablauf. Doch jetzt kommt das Problem. Es KANN passieren, daß das Script sich scheinbar selbst überholt. Dann wird eine Datei korrekt verarbeitet, dann aber nochmal aufgerufen. Blöd bei dieser Situation ist, daß dann sowohl Ausgangsdatei als auch verschlüsselte Datei gelöscht sind. Oder es wird drei Mal verkehrt verschlüsselt, dann aber die Datei nochmal aufgerufen und dieses mal korrekt verschlüsselt.
Merkwürdig ist auch, daß Datensätze erneut aufgerufen werden, obwohl sie bereits als verarbeitet gekennzeichnet wurden. Eben als ob das Script mehrfach laufen würde und sich gegenseitig überholt. Zeitweise geht es gut und zeitweise eben nicht. Dafür würde auch sprechen, daß die Fehler nicht konstant durchgehen, sondern zwischendrin auch wieder hunderte und tausende Dateien korrekt im ersten Lauf verschlüsselt werden. Das Programm wird aber nicht mehrfach gestartet.
Es kann aber auch sein, daß eine Stunde später der selbe Lauf mit den exakt selben Dateien ohne einen einzigen Fehler durchläuft.
Ich hatte auch schon die Überlegung, daß es an der Sortierung der Datensätze liegen könnte. Ich lasse sie nach Kundennummern sortiert laufen, um nicht ständig den individuellen Schlüssel auslesen zu müssen. Könnte das das Problem sein? Wäre es besser, die Reihenfolge mit Zufallszahlen durcheinander zu bringen um das Script damit einzubremsen?
Auch mit dem Support unseres Providers bin ich die Sache schon ein paar mal durchgegangen. Er hat an ein paar Servereinstellungen gedreht, was aber auch nichts gebracht hat.
Im Moment sind es nur kleine Testläufe mit 30- 50000 Dateien. Nur wenn es dann mal soweit ist und die originalen Dateien drankommen, dann darf es keine Fehler geben. Aus Platzgründen kann ich die rund 200 GB an Daten nicht aufheben bis alles erledigt ist. Ich muß die nach Verarbeitung löschen.
Hat jemand eine Idee, wie das Programm optimiert werden kann oder so eingebremst, daß es nicht ins stolpern kommt? Beim zeitlichen Rahmen ist noch Luft. Die rund 200000 Dateien brauchen zum verschlüsseln geschätzt 4-5 Stunden, wenn es also etwas länger dauert, wäre das nicht das Problem. Es muß nur innerhalb eines Tages durchgelaufen sein.
Vielen Dank schon mal im Voraus,
Sprint