Dies ist der Fall: Ich habe eine 2Gb-Dump-Datei namens myDB.sql. Es ist eine Speicherabbilddatei, die eine vorhandene Datenbank löscht und eine neue erstellt, mit Ansichten und Triggern. Also habe ich die Zeichenfolge myDB_OLD
für viele Zeilen des Codes verteilt. Ich möchte diese Zeichenfolgenvorkommen zu myDB_NEW
ändern. Ich könnte dies mit Hilfe von notePad ++ tun. Aber Notizblock öffnet keine 2 GB-Datei. Was ich getan habe, ist ein PHP-Code, der Zeile für Zeile liest und finde die Zeichenfolge, die ich will.Wie groß ist die Größe einer PHP-Variablen beim Speichern von Strings?
Dies ist der Code:
$myfile2 = fopen("myDB.sql", "r") or die("Unable to open file!");//Reads the file
while (!feof($myfile2)) {//Pass trough each line
$str=fgets($myfile2);//Store the line inside a variable
if (preg_match("/myDB_OLD/",$str)) {//If the string I want to change exists - replace it and conacatenate
$newStr .= str_replace("myDB_OLD","myDB_NEW",$str);
}
else {//If not concatenate it
$newStr .=$str;
}
}//End of while
fclose($myfile2);
//Save the newStr in a new file named
$myfile = fopen("newDB.sql", "w") or die("Unable to open file!");
fwrite($myfile, $newStr);
echo "finished";
Dieser Code abrufen jede Zeile der Datei in Variable die Zeichenfolge, verketten ändert und eine neue Datei erstellt. Es sollte funktionieren, aber es ist nicht. Ich weiß nicht warum. Ich benutze xdebug, um herauszufinden, was das Problem ist, aber kein Glück.
Also ändere ich den Ansatz. Anstatt jede Zeile in einer Variablen zu speichern, speichere ich sie direkt in einer Datei und das funktioniert gut.
Dies ist der neue Code:
$myfile = fopen("newDB.sql", "w") or die("Unable to open file!");//Creates a new file "newDB.sql"
$myfile2 = fopen("myDB.sql", "r") or die("Unable to open file!");//Reads the file
while (!feof($myfile2)) {//Pass trough each line
$str=fgets($myfile2);//Store the line inside a variable
if (preg_match("/myDB/",$str)) {//If the string I want to change exists - replace it . (Do not concatenate)
$strRep=str_replace("myDB","myDB_NEW",$str);
}
else {
$strRep =$str;
}
fwrite($myfile, $strRep);// Add the new line to the file "newDB.sql"
}//End of while
fclose($myfile);
fclose($myfile2);
echo "finished";
Ok, löste ich mein Problem, aber es wirft einen Gedanken. Was ist das Problem des ersten Codes? Ich denke, das Problem ist die Menge an Informationen in einer PHP-Variable, 2 GB gespeichert werden. Also gibt es eine Grenze in der Größe zu einer PHP-Variablen, um Wert zu speichern, in diesem Fall eine Zeichenfolge? Wenn ja, wie kann ich es überprüfen oder ändern? Jede php.ini Variable?
Welchen Fehler gibt es? Und was ist das Speicherlimit in Ihrer php.ini-Datei? –
Und wie Sie einen MySQL-Dump in einen beliebigen Datenbanknamen importieren können, warum müssen Sie das überhaupt erst machen? –
Für die erste Frage. Es gibt keinen Fehler. Xdebugt wirft keinen Fehler. Es stoppt nur innerhalb der Schleife zu arbeiten. Für das Speicherlimit könnte ich es überprüfen, wenn ich neu bin, dies ist der Grund, warum ich es nicht als meine erste Annäherung vor dem Umverdrahten des Codes überprüft habe. Für die zweite Frage.Es war eine spezielle Situation und ich weiß nicht, ob ich den Datenbanknamen ändere, es wird alle Vorkommen innerhalb der Dump-Datei ändern, wie zum Beispiel Auslöser erstellen usw. Ich kann es testen. Weißt du es? – zwitterion