Qual è il limite di size di una variabile Php quando si memorizza una string?

Questo è il caso: ho un file di dump da 2 GB chiamato myDB.sql . È un file di dump che cancella un database esistente e ne crea uno nuovo, con viste e trigger. Quindi ho la string myDB_OLD diffusa per molte righe del codice. Vorrei cambiare queste occorrenze di stringhe su myDB_NEW . Potrei farlo facilmente usando notePad ++. Ma il block note non apre un file da 2 GB. Quello che ho fatto è un codice PHP che legge row per row e trovare e sostituire la string che voglio.

Questo è il codice:

 $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"; 

Questo codice recupera each row del file cambia la string, concatena nella variabile e crea un nuovo file. Dovrebbe funzionare ma non lo è. Non so perché. Sto usando xdebug per capire qual è il problema, ma senza fortuna.

Quindi cambio l'approccio. Invece di salvare each row in una variabile, la salverò direttamente in un file e ciò funziona bene.

Questo è il nuovo codice:

 $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, ho risolto il problema ma solleva un pensiero. Qual è il problema del primo codice? Penso che il problema sia la quantità di informazioni da memorizzare in una variabile PHP, 2Gb. Quindi, c'è un limite nella dimensione di una variabile PHP per memorizzare il valore, in questo caso, una string? Se sì, come posso controllarlo o cambiarlo? Qualche variabile php.ini?

Quindi, esiste un limite nella dimensione di una variabile Php per memorizzare il valore, in questo caso, una string?

Sì. Una string può essere grande fino a 2 GB (massimo 2147483647 byte) . Non puoi sovrascrivere questo limite aumentando la direttiva memory_limit in php.ini.

Da php7 non c'è quella limitazione in un sistema a 64 bit:

Supporto per stringhe con lunghezza> = 2 ^ 31 byte in build a 64 bit.

Il numero massimo di byte consentito da uno script è impostato su php.ini. Cerca memory_limit . Questo è 16Mb dopo PHP 5.2.0 come predefinito!

Questo può essere cambiato facendo un:

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

La dimensione massima di una string è di 2 GB in PHP, probabilmente a causa delle limitazioni di indirizzamento, se consentito da memory_limit .