我下载了一个导出为TXT格式的数据库,大约700MB,有700万条记录(每行1条)。 我制作了一个脚本将数据导入mysql数据库,但是当插入大约400万条记录时,浏览器崩溃了。 我在Firefox和IE中测试过。 有人能给我一个意见和一些建议吗?
脚本是这样的:
<?php
set_time_limit(0);
ini_set('memory_limit','128M');
$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }
while(!feof($ponteiro)){
$conta++;
$linha = fgets($ponteiro,4096);
$linha = str_replace("\"", "", $linha);
$arr = explode(";",$linha);
$sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
$rs = mysql_query($sql);
if(!$rs){ echo $conta ." error";}
if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
myflush();
}
echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
答案 0 :(得分:2)
尝试以100 MB的块分割文件。这是完成工作的快速解决建议。浏览器问题可能很难解决。尝试不同的浏览器。
如果发生崩溃,phpMyadmin可以选择继续查询。如果脚本检测到接近时间限制,则允许中断导入。这可能是导入大文件的好方法,但它可能会破坏事务。
答案 1 :(得分:2)
我不确定为什么你需要一个Web浏览器来将记录插入mysql。为什么不直接使用数据库本身的导入工具并将其从Web中删除?
如果那是不可能的,我想知道是否一次将插入分组成1000个组会有所帮助。我建议不要将整个数据库作为单个事务提交。
您使用的是InnoDB吗?
答案 2 :(得分:2)
我首先注意到的是你不安全地使用flush()。当httpd缓冲区已满时执行flush()会导致错误,并且脚本将死亡。放弃所有这些myflush()变通方法,改为使用单个ob_implicit_flush()
。
您无需在浏览器中看到它就可以使其工作到最后,您可以放置ignore_user_abort()
,这样即使您的浏览器死亡,您的代码也将完成其工作。
不确定您的浏览器为什么会死亡。也许你的脚本产生了太多的内容。
答案 3 :(得分:1)
尝试没有
&LT峰; br&GT;暂停:nnnn
输出到浏览器,看看是否有帮助。可能只是浏览器在要求渲染的长网页上窒息。
此外,PHP在长时间转移期间是否超时?
你也睡觉(10)增加了它所花费的时间也没有帮助。
答案 4 :(得分:0)
您可以尝试将文件拆分为不同的TXT文件,然后使用这些文件重做该过程。我知道我至少曾经使用过这种方法。
答案 5 :(得分:0)
浏览器窒息,因为请求耗时太长而无法完成。这个过程是否应该成为网页的一部分?如果您绝对必须这样做,请考虑将数据拆分为可管理的块。
答案 6 :(得分:0)
使用PHP-CLI在命令行中运行代码。这样,您就不会遇到长时间运行过程的超时。虽然,情况是你的浏览器在超时之前崩溃^^。 如果您尝试在没有shell访问权限的托管服务器中执行,请使用crontab运行代码。但是,您必须确保crontab 仅运行一次!