1

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

7 回答 7

2

尝试将文件拆分为 100 MB 块。这是完成工作的快速解决建议。浏览器问题可能会变得难以解决。也尝试不同的浏览器。

如果发生崩溃,phpMyadmin 可以选择继续查询。如果脚本检测到接近时间限制,则允许中断导入。这可能是导入大文件的好方法,但它可能会破坏事务。

于 2009-08-22T22:22:08.537 回答
2

我不知道为什么你需要一个网络浏览器来将记录插入 mysql。为什么不直接使用数据库本身的导入功能,而将 Web 排除在外呢?

如果那不可能,我想知道一次将插入分成 1000 个组是否会有所帮助。我建议不要将整个数据库作为单个事务提交,而是将其分解。

你在使用 InnoDB 吗?

于 2009-08-22T22:23:45.537 回答
2
  1. 我首先注意到的是您使用 flush() 不安全。当 httpd 缓冲区已满时执行 flush() 会导致错误并且您的脚本终止。放弃所有这些 myflush() 解决方法并改用单个解决方法ob_implicit_flush()

  2. 您无需在浏览器中查看它即可使其工作到最后,您可以放置​​ aignore_user_abort()这样即使您的浏览器死机,您的代码也能完成其工作。

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

于 2009-08-22T22:36:01.503 回答
1

试试看没有

<br> 暂停:nnnn

输出到浏览器,看看是否有帮助。可能只是浏览器在它被要求呈现的长网页上卡住了。

另外,长时间传输期间PHP是否超时?

同样,您的 sleep(10) 增加了它所花费的时间也无济于事。

于 2009-08-22T22:27:41.973 回答
0

您可以尝试将文件拆分为不同的 TXT 文件,然后使用这些文件重做该过程。我知道我至少使用过一次这种方法。

于 2009-08-22T22:21:18.133 回答
0

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

于 2009-08-22T22:39:18.643 回答
0

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

于 2009-08-23T01:53:31.627 回答