2015-11-23 18 views
6

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?

+0

Jaki błąd daje? A jaki jest limit pamięci ustawiony w pliku php.ini? –

+0

A ponieważ możesz importować zrzut MySQL do dowolnej nazwy bazy danych, dlaczego w ogóle musisz to zrobić? –

+0

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

Odpowiedz

7

Czy istnieje ograniczenie rozmiaru do zmiennej PHP, która przechowuje wartość, w tym przypadku ciąg znaków?

Tak. A string can be as large as up to 2GB (2147483647 bytes maximum). Nie możesz przekroczyć tego limitu, podnosząc dyrektywę memory_limit w php.ini.

From php7 nie jest takie ograniczenie w systemie 64-bitowym:

Wsparcie dla ciągów o długości> = 2^31 bajtów w 64 bit buduje.

+2

Dobrze. Nawet o tym nie pomyślałem. Ale, jak wspomniano powyżej - aplikacja PHP korzystająca z ponad 2 GB jest prawdopodobnie warta refaktoryzacji :) –

+0

O czym ty mówisz o Quake @Rob ??? aplikacja PHP korzystająca z ponad 2 GB? Co??? Ma 2 GB danych. nie warte 2gb rzeczy PHP ... Piszący kod php do skopiowania w bazie danych 2GB ... Pracuję teraz z bazą danych 10 Gb i pracowałem z bazami danych o wielkości do 200 gb w przeszłości ... Dlaczego mówisz, że powinienem dokonać refaktoryzacji? Mam mnóstwo danych i to wszystko. Mój kod php nie ponosi winy. Nic nie jest winne. Jest tylko wielu użytkowników i dużo ręcznego i automatycznego wprowadzania danych ... Każda linia w tej bazie jest przydatna i potrzebna ... –

+0

Mam na myśli, że jeśli używasz 2 GB pamięci RAM w jednym momencie, warto refaktoryzować. Oczywiście nie chodziło o dane. –

3

Maksymalna liczba bajtów, którą skrypt może przydzielić, jest ustawiona w pliku php.ini. Wyszukaj memory_limit. Domyślnie jest to 16 MB po PHP 5.2.0!

ta może zostać zmieniona przez robi:

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

Maksymalna size of a string jest 2 GB w PHP, prawdopodobnie ze względu na ograniczenia adresowania, jeśli jest to dozwolone przez memory_limit.

+1

Rzeczywiście. Chociaż prawdopodobnie robisz coś nie tak, jeśli potrzebujesz ogromnych ilości. Metoda liniowa, którą tam wykonałeś, jest właściwym rozwiązaniem. –

+3

Ponadto ten limit można zwiększyć, używając 'set_memory_limit()'. – Peter

+2

@RobQuist Masz całkowitą rację, chociaż czasami podczas analizowania plików xls lub pdf rozmiar może przekroczyć 16M – Peter

Powiązane problemy