1

TXT 形式にエクスポートされ、700 万レコード (1 行に 1 つ) を含む約 700MB のデータベースをダウンロードしました。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
  1. 私が最初に気付いたのは、flush()を安全に使用していないということです。httpdバッファがいっぱいのときにflush()を実行すると、エラーが発生し、スクリプトが停止します。このmyflush()の回避策をすべてあきらめて、ob_implicit_flush()代わりに1つを使用してください。

  2. あなたはそれを最後まで機能させるためにあなたのブラウザでそれを見る必要はありません、あなたはignore_user_abort()あなたのブラウザが死んだとしてもあなたのコードがその仕事を完了するように置くことができます。

  3. ブラウザが機能しなくなった理由がわかりません。スクリプトが生成するコンテンツが多すぎる可能性があります。

于 2009-08-22T22:36:01.503 に答える
2

ファイルを 100 MB のチャンクに分割してみてください。これは、仕事を終わらせるための迅速な解決策です。ブラウザの問題は、解決が複雑になる可能性があります。さまざまなブラウザも試してください。

phpMyadmin には、クラッシュが発生した場合にクエリを続行するオプションがあります。制限時間に近づいていることをスクリプトが検出した場合に、インポートの中断を許可します。これは大きなファイルをインポートするのに適した方法かもしれませんが、トランザクションが壊れる可能性があります。

于 2009-08-22T22:22:08.537 に答える
2

レコードを mysql に挿入するために Web ブラウザが必要な理由がわかりません。データベース自体のインポート機能を使用して、Web を除外しないのはなぜですか?

それが不可能な場合は、挿入を一度に 1000 個のグループに分割すると役立つのではないかと思います。データベース全体を単一のトランザクションとしてコミットするのではなく、分割することをお勧めします。

InnoDB を使用していますか?

于 2009-08-22T22:23:45.537 に答える
1

なしで試してみてください

<br> 一時停止: nnnn

ブラウザに出力して、それが役立つかどうかを確認してください。単純に、レンダリングを要求された長い Web ページでブラウザが窒息している可能性があります。

また、長い転送中に PHP がタイムアウトすることはありますか?

また、sleep(10) を使用して時間がかかることも役に立ちません。

于 2009-08-22T22:27:41.973 に答える
0

リクエストの完了に時間がかかりすぎるため、ブラウザが窒息しています。このプロセスをWebページの一部にする必要がある理由はありますか?どうしてもこの方法で行う必要がある場合は、データを管理可能なチャンクに分割することを検討してください。

于 2009-08-22T22:39:18.643 に答える
0

PHP-CLI を使用して、コマンド ラインでコードを実行します。このようにして、実行時間の長いプロセスでタイムアウトが発生することはありません。ただし、タイムアウト前にブラウザがクラッシュする状況です ^^。シェル アクセス権がないホスティング サーバーで実行しようとする場合は、crontab を使用してコードを実行します。ただし、crontabが 1 回だけ実行されるようにする必要があります。

于 2009-08-23T01:53:31.627 に答える
0

ファイルを別の TXT ファイルに分割してみて、ファイルを使用してプロセスをやり直すことができます。私は少なくとも一度そのアプローチを使用したことを知っています。

于 2009-08-22T22:21:18.133 に答える