W tym przypadku: Mam plik zrzutu 2 Gb o nazwie myDB.sql. Jest to plik zrzutu, który usuwa istniejącą bazę danych i tworzy nową, z widokami i wyzwalaczami. Więc mam ciąg znaków myDB_OLD
rozprzestrzeniony dla wielu linii kodu. Chciałbym zmienić te ciągi wystąpień na myDB_NEW
. Mógłbym to zrobić z łatwością używając notePad ++. Ale notatnik nie otwiera pliku 2Gb. To, co zrobiłem, to kod PHP, który czyta wiersz po wierszu, znajdź i zamień żądany ciąg znaków.Jaki jest limit rozmiaru zmiennej PHP podczas przechowywania ciągu znaków?
Jest to kod:
$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";
Ten kod pobrać każdy wiersz pliku zmienia łańcuch, złączyć w zmienny i tworzy nowy plik. Powinno działać, ale tak nie jest. Nie wiem dlaczego. Używam xdebug, aby dowiedzieć się, co jest problemem, ale bez powodzenia.
Zmieniam podejście. Zamiast zapisywać każdą linię w zmiennej, zapisuję ją bezpośrednio w pliku i działa dobrze.
To jest nowy kod:
$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, mogę rozwiązać mój problem, ale to rodzi myśl. Jaki jest problem pierwszego kodu? Myślę, że problemem jest ilość informacji, które mają być przechowywane w zmiennej PHP, 2 GB. Czy istnieje ograniczenie rozmiaru do zmiennej PHP, która przechowuje wartość, w tym przypadku ciąg znaków? Jeśli tak, jak mogę to sprawdzić lub zmienić? Dowolna zmienna php.ini?
Jaki błąd daje? A jaki jest limit pamięci ustawiony w pliku php.ini? –
A ponieważ możesz importować zrzut MySQL do dowolnej nazwy bazy danych, dlaczego w ogóle musisz to zrobić? –
Na pierwsze pytanie. Nie ma błędu. Xdebugt nie generuje żadnego błędu. Zatrzymuje się tylko do pracy w pętli. Dla limitu pamięci mogłem to sprawdzić, jeśli to jest nowe, dlatego nie sprawdzałem tego jako mojego pierwszego podejścia przed przeprogramowaniem kodu. Na drugie pytanie.To była konkretna sytuacja i nie wiem, czy zmienię nazwę bazy danych, to zmieni wszystkie wystąpienia w pliku zrzutu, jak tworzy wyzwalacze i itp. Mogę to przetestować. Znasz to? – zwitterion