0

WordPress サイトの管理セクションに組み込んだ Web インターフェイスがあります。データベース内のいくつかのテーブルをスクレイピングし、データの大きなリストを行ごとに表示するだけです。このデータには約 30,000 行があり、for ループの基本的なエコーで表示されます。ページに 30,000 行すべてを表示すると問題なく動作します。

さらに、完全なデータ行の CSV ファイルをダウンロードするオプションが含まれています。を使用fopenfputcsvて、データ クエリの結果からダウンロードする CSV ファイルを作成します。この機能は以前は機能していましたが、データセットが 30,000 になり、CSV が正しく生成されなくなりました。最初の 200 ~ 1000 行が CSV ファイルに書き込まれ、データの大部分が除外されます。私の場合、適切に生成されなかった CSV は約 10 メガバイトになると見積もっています。次に、すべてが正しく機能しているかのように、ファイルは最初の 200 ~ 1000 行をダウンロードします。

コードは次のとおりです。

// This gets a huge list of data from a SP I built. This data is well formed
$data = $this->run_stats_stored_procedure($job_to_report);

// This is where the data is converted into a csv file. This part is broken
// the file may already exist at that location burn it down if it does
if(file_exists(ABSPATH . "some/path/to/my/file/csv_export.csv")) {
    unlink(ABSPATH . "some/path/to/my/file/csv_export.csv");                 
}
$csv_file_handler = fopen(ABSPATH . "some/path/to/my/file/candidate_export.csv", 'w');

if(!empty($csv_file_handler)) {

    $title_array = array(
        "ID",
        "other_feild"
    );

    fputcsv($csv_file_handler, $title_array, ",");

    if(!empty($data)) {

        foreach($data as $data_piece) {
            $array_as_csv_line = array();   

            foreach($data_piece as $object_property) {                  
                $array_as_csv_line[] = (string)$object_property;
            }

            fputcsv($csv_file_handler, $array_as_csv_line, ",");    
            unset($array_as_csv_line);
        }
    } else {
        fputcsv($csv_file_handler, array("empty"), ",");
    }           
    // pros clean everything up when they are done
    fclose($csv_file_handler);
}

CSV ファイル全体をダウンロードするために何を変更する必要があるかわかりません。これは構成の問題である可能性があると思いますが、そうすべきではありません。この関数は以前は 20,000 の csv 行でも機能していましたが、現在は 30,000 で壊れているため、私はこれを信じるようになりました。追加情報が役立つかどうかお知らせください。以前に巨大な CSV ファイルで問題に遭遇した人はいますか? 助けてくれる人に感謝します。

4

2 に答える 2

0

私が現在実装している答えは、スクリプトがより多くの時間を使用できるようにすることです。これを行うには、スクリプトを実行する前に次のコードを実行するだけです。

set_time_limit ( 3600 );

これは持続可能な解決策ではないため、さらに調査を行っています。さらにアドバイスをいただければ幸いです。

于 2013-08-30T15:23:19.703 に答える