2015-11-23 12 views
6

Đây là trường hợp: Tôi có tệp kết xuất 2Gb được gọi là myDB.sql. Đây là tệp kết xuất xóa cơ sở dữ liệu hiện có và tạo một cơ sở dữ liệu mới, với chế độ xem và trình kích hoạt. Vì vậy, tôi có chuỗi myDB_OLD lây lan cho nhiều dòng mã. Tôi muốn thay đổi các chuỗi này thành số myDB_NEW. Tôi có thể làm điều này easelly sử dụng notePad ++. Nhưng notepad không mở tập tin 2Gb. Những gì tôi đã làm là một mã PHP đọc từng dòng và tìm và thay thế chuỗi mà tôi muốn.Giới hạn kích thước của biến Php khi lưu trữ chuỗi là gì?

Đây là mã:

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

Mã này lấy mỗi dòng của tập tin thay đổi chuỗi, nối trong biến và tạo ra một tập tin mới. Nó sẽ hoạt động nhưng nó không phải là. Tôi không biết tại sao. Tôi đang sử dụng xdebug để tìm ra vấn đề là gì, nhưng không may mắn.

Vì vậy, tôi thay đổi cách tiếp cận. Thay vì lưu từng dòng trong một biến, tôi lưu trực tiếp vào một tệp và hoạt động tốt.

Đây là mã mới:

$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, tôi giải quyết vấn đề của tôi, nhưng nó đặt ra một suy nghĩ. Vấn đề của mã đầu tiên là gì? Tôi nghĩ vấn đề là lượng thông tin được lưu trữ trong biến PHP, 2Gb. Vì vậy, có một giới hạn về kích thước cho một biến PHP để lưu trữ giá trị, trong trường hợp này, một chuỗi? Nếu có, tôi có thể kiểm tra hoặc thay đổi nó bằng cách nào? Biến php.ini nào?

+0

Lỗi gì? Và giới hạn bộ nhớ trong tập tin php.ini của bạn là bao nhiêu? –

+0

Và khi bạn có thể nhập một kết xuất MySQL vào bất kỳ tên cơ sở dữ liệu nào, tại sao bạn thậm chí cần phải làm điều này ngay từ đầu? –

+0

Đối với câu hỏi đầu tiên. Không có lỗi. Xdebugt không ném bất kỳ lỗi nào. Nó chỉ dừng lại để làm việc bên trong vòng lặp. Đối với giới hạn bộ nhớ, tôi có thể kiểm tra nó nếu tôi mới đây là trường hợp này là lý do tại sao tôi đã không kiểm tra nó như là cách tiếp cận đầu tiên của tôi trước khi để viết lại mã. Đối với câu hỏi thứ hai.Đó là một tình huống cụ thể và tôi không biết nếu tôi thay đổi tên cơ sở dữ liệu nó sẽ thay đổi tất cả các lần xuất hiện bên trong tệp kết xuất như tạo trình kích hoạt và v.v. Tôi có thể kiểm tra nó. Bạn có biết nó không? – zwitterion

Trả lời

7

Vì vậy, có giới hạn về kích thước cho biến Php để lưu trữ giá trị, trong trường hợp này là chuỗi không?

Có. A string can be as large as up to 2GB (2147483647 bytes maximum). Bạn không thể ghi đè giới hạn này bằng cách tăng chỉ thị memory_limit trong php.ini.

From php7 có không phải là hạn chế trong một hệ thống 64 bit:

Hỗ trợ cho các chuỗi có chiều dài> = 2^31 byte trong 64 bit xây dựng.

+2

Tốt nhất. Thậm chí không nghĩ về điều đó. Tuy nhiên, như đã đề cập ở trên - một ứng dụng PHP sử dụng trên 2GB có thể tái cấu trúc có giá trị :) –

+0

Bạn đang nói gì về @Rob Quist ??? một ứng dụng PHP sử dụng hơn 2Gb? Gì??? Anh ta có 2GB DỮ LIỆU. không phải 2GB giá trị của công cụ PHP ... Anh ấy đang viết mã php để sao chép qua cơ sở dữ liệu 2gb ... Tôi đang làm việc với cơ sở dữ liệu 10Gb ngay bây giờ và đã làm việc với cơ sở dữ liệu lên tới 200gb trong quá khứ ... bạn nói tôi nên làm một số refactoring? Tôi nhận được rất nhiều dữ liệu và điều đó. Mã php của tôi không phải là lỗi. Không có gì là do lỗi. Chỉ có rất nhiều người dùng và nhiều mục nhập dữ liệu thủ công và tự động ... Mỗi dòng trong cơ sở dữ liệu đó đều hữu ích và cần thiết ... –

+0

Ý tôi là nếu bạn đang sử dụng bộ nhớ RAM 2GB tại một thời điểm, tái cấu trúc giá trị. Đã không nói về dữ liệu, rõ ràng. –

3

Số byte tối đa mà tập lệnh được phép phân bổ được đặt trong php.ini. Tìm kiếm memory_limit. Đây là 16Mb sau PHP 5.2.0 làm mặc định!

này có thể được thay đổi bằng cách làm một:

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

Tối đa size of a string là 2 GB trong PHP, có lẽ vì những hạn chế adressing, nếu được cho phép bởi memory_limit.

+1

Thật vậy. Mặc dù bạn có thể làm điều gì đó sai nếu bạn cần số tiền khổng lồ ở đó. Phương pháp từng dòng bạn đã thực hiện có một giải pháp thích hợp. –

+3

Ngoài ra, giới hạn này có thể tăng lên bằng cách sử dụng 'set_memory_limit()'. – Peter

+2

@RobQuist Bạn hoàn toàn đúng, mặc dù đôi khi khi phân tích cú pháp tệp xls hoặc pdf, kích thước có thể vượt quá 16M – Peter

Các vấn đề liên quan