2015-11-23 3 views
6

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?

+0

Welchen Fehler gibt es? Und was ist das Speicherlimit in Ihrer php.ini-Datei? –

+0

Und wie Sie einen MySQL-Dump in einen beliebigen Datenbanknamen importieren können, warum müssen Sie das überhaupt erst machen? –

+0

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

Antwort

7

Also gibt es eine Grenze in der Größe zu einer PHP-Variable, um Wert zu speichern, in diesem Fall eine Zeichenfolge?

Ja. A string can be as large as up to 2GB (2147483647 bytes maximum). Sie können dieses Limit nicht überschreiben, indem Sie die Anweisung memory_limit in php.ini erhöhen.

From php7 gibt es nicht, dass die Beschränkung in einem 64-Bit-System:

Unterstützung für Strings mit einer Länge von> = 2^31 Bytes in 64-Bit-aufbaut.

+2

Gute Eins. Hatte nicht einmal daran gedacht. Aber, wie oben erwähnt - eine PHP-Anwendung mit mehr als 2 GB ist es wert, Refactoring :) –

+0

Wovon redest du @Rob Quist ??? eine PHP-Anwendung mit über 2 GB? Was??? Er hat 2 GB Daten. nicht 2gb Wert von PHP Zeug ... Er schreibt einen PHP-Code, um über eine 2GB-Datenbank zu kopieren ... Ich arbeite gerade mit einer 10Gb-Datenbank und arbeitete in der Vergangenheit mit Datenbanken von bis zu 200GB ... Warum? Sie sagen, ich sollte etwas Refactoring tun? Ich habe eine Menge Daten, und das ist es. Mein PHP-Code ist nicht schuld. Nichts ist schuld. Es gibt nur eine Menge Benutzer und viele manuelle und automatische Dateneingabe ... Jede einzelne Zeile in dieser Datenbank ist nützlich und notwendig ... –

+0

Ich meine, wenn Sie Code 2GB RAM in einem einzigen Moment verwenden, ist es es lohnt sich Refactoring. Es ging natürlich nicht um Daten. –

3

Die maximale Anzahl der Bytes, die ein Skript zuweisen darf, wird in php.ini festgelegt. Suchen Sie nach memory_limit. Dies ist 16 MB nach PHP 5.2.0 als Standard!

ini_set('memory_limit','24M'); 

Die maximale size of a string ist 2 GB in PHP, wahrscheinlich wegen der adressing Einschränkungen durch memory_limit erlaubt, wenn:

Dies kann, indem Sie ein geändert werden.

+1

In der Tat. Obwohl Sie wahrscheinlich etwas falsch machen, wenn Sie dort große Mengen benötigen. Die Line-by-Line-Methode, die Sie dort gemacht haben, ist eine richtige Lösung. –

+3

Zusätzlich kann dieses Limit mit 'set_memory_limit()' erhöht werden. – Peter

+2

@RobQuist Sie sind ganz richtig, obwohl manchmal beim Analysieren xls oder pdf-Dateien die Größe über 16M – Peter

Verwandte Themen