zwi*_*ion 8 php string variables
情况就是这样:我有一个名为myDB.sql的2Gb转储文件.它是一个转储文件,用于删除现有数据库并使用视图和触发器创建新数据库.所以我有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";
Run Code Online (Sandbox Code Playgroud)
此代码检索文件的每一行更改字符串,在变量中连接并创建一个新文件.它应该有效,但事实并非如此.我不知道为什么.我正在使用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";
Run Code Online (Sandbox Code Playgroud)
好吧,我解决了我的问题,但它提出了一个想法.第一个代码的问题是什么?我认为问题是要存储在PHP变量2Gb中的信息量.那么,PHP变量的大小是否有限制来存储值,在本例中是一个字符串?如果是,我该如何检查或更改它?任何php.ini变量?
那么,Php变量的大小是否有限制来存储值,在本例中是一个字符串?
是.字符串最大可达2GB(最大2147483647字节).您不能通过增加memory_limitphp.ini中的指令来覆盖此限制.
从php7开始,64位系统没有这个限制:
支持64位构建中长度> = 2 ^ 31字节的字符串.