Каков предел в размере переменной Php при сохранении строки?

Это так: у меня есть файл дампа 2Gb, называемый myDB.sql . Это файл дампа, который удаляет существующую базу данных и создает новую, с представлениями и триггерами. Поэтому у меня есть строка myDB_OLD для многих строк кода. Я хотел бы изменить эти строки в myDB_NEW . Я мог бы сделать это легко, используя notePad ++. Но блокнот не открывает файл 2Gb. То, что я сделал, это PHP-код, который читается по строкам и находит и заменяет строку, которую я хочу.

Это код:

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

Этот код извлекает каждую строку файла, меняет строку, объединяется в переменную и создает новый файл. Он должен работать, но это не так. Я не знаю, почему. Я использую xdebug, чтобы выяснить, в чем проблема, но не повезло.

Поэтому я меняю подход. Вместо сохранения каждой строки в переменной я сохраняю ее непосредственно в файле, и это работает хорошо.

Это новый код:

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

Хорошо, я решил свою проблему, но это вызывает мысль. В чем проблема первого кода? Я думаю, что проблема заключается в количестве информации, которая должна храниться в переменной PHP, 2Gb. Итак, существует ли ограничение по размеру переменной PHP для хранения значения, в данном случае, строки? Если да, то как я могу проверить или изменить его? Любая переменная php.ini?

Итак, существует ли ограничение по размеру переменной Php для хранения значения, в данном случае, строки?

Да. Строка может достигать 2 ГБ (максимум 2147483647 байт) . Вы не можете переопределить этот предел, увеличив директиву memory_limit в php.ini.

Из php7 в 64-битной системе нет такого ограничения:

Поддержка строк с длиной> = 2 ^ 31 байта в 64-битных строках.

Максимальное количество байт, которые разрешен для сценария, устанавливается в php.ini. Найдите memory_limit . Это 16Mb после PHP 5.2.0 по умолчанию!

Это можно изменить, выполнив:

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

Максимальный размер строки составляет 2 ГБ в PHP, вероятно, из-за ограничений доступа, если допускается memory_limit .