Đâ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?
Lỗi gì? Và giới hạn bộ nhớ trong tập tin php.ini của bạn là bao nhiêu? –
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? –
Đố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