我下载了一个导出为 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);
?>
有帮助吗?

解决方案

尝试分割文件在100点MB的块。这是一个快速的解决建议,把工作做好。该浏览器的问题可以得到复杂的解决。也尝试不同的浏览器。

phpMyAdmin的有一些选项可以继续查询,如果事故发生。允许中断进口的情况下,脚本检测是接近时限。这可能是导入大文件时很好的方式,但它可以打破交易。

其他提示

我不知道为什么你需要一个Web浏览器将记录插入到MySQL。为什么不使用数据库本身的进口设备和离开网络的出来吗?

如果这是不可能的,我不知道是否分块的镶入的1000组同时将帮助。而不是提交整个数据库作为单个事务,我建议打破它。

您使用的是InnoDB?

  1. 我首先注意到的是您不安全地使用flush()。当httpd 缓冲区已满时执行flush() 会导致错误并且脚本终止。放弃所有这些 myflush() 解决方法并使用单个 ob_隐式_刷新() 反而。

  2. 您不需要使用浏览器来查看它以使其工作到最后,您可以放置​​一个 忽略用户中止() 因此,即使您的浏览器死机,您的代码也将完成其工作。

  3. 不知道为什么你的浏览器死了。也许您的脚本生成了太多内容。

,没有尝试

,点击暂停:NNNN

输出到浏览器,并且看是否有帮助。这可能是简单的浏览器正在长网页它要求呈现的窒息。

而且,PHP是定时出长传输期间?

有没有帮助,也,你有睡眠(10)增加所花费的时间。

您可以尝试分手了不同的TXT文件的文件,并使用文件重做过程。我知道我至少使用这种方法一次。

浏览器被阻塞,因为请求的时间太长来完成。是否有一个原因,这个过程应该是一个网页的一部分?如果你绝对要做到这样,考虑管理的块拆分您的数据。

使用PHP-CLI命令行

运行代码。这样一来,你永远不会遇到超时长时间运行的过程。虽然,这种情况是你的浏览器崩溃之前超时^^。 如果您尝试在托管你没有shell访问的服务器来执行,用crontab中运行代码。但是,你必须确保crontab中的只运行一次

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top