そのため、データベースからレコードを読み取り、ユーザーがダウンロードするテキスト ファイルに保存するという簡単な解決策でなんとかやり遂げたいと考えていました。私はこれをオンザフライで実行しており、20,000 レコード未満の場合、これはうまく機能します。20,000 を超えるレコードとメモリにロードするデータが多すぎて、PHP で致命的なエラーが発生します。
私の考えは、すべてをチャンクで取得することでした。したがって、XX 行を取得してファイルにエコーし、完了するまでループして次の XX 行を取得します。
ただし、ファイルをビルドしてからダウンロード用に送信するのではなく、現在結果をエコーしています。これは、実行する必要があると推測しています。
この時点での問題は、簡潔に言うと、最大 20,000 行で、ファイルが完全にビルドおよびダウンロードされることです。それ以上の場合、空のファイルが得られます。
コード:
header('Content-type: application/txt');
header('Content-Disposition: attachment; filename="export.'.$file_type.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
// I do other things to check for records before, hence the do-while loop
$this->items = $model->getItems();
do {
foreach ($this->items as $k => $item) {
$i=0;
$tables = count($this->data['column']);
foreach ($this->data['column'] as $table => $fields) {
$columns = count($fields);
$j = 0;
foreach ($fields as $field => $junk) {
if ($quote_output) {
echo '"'.ucwords(str_replace(array('"'), array('\"'), $item->$field)).'"';
} else {
echo ''.$item->$field.'';
}
$j++;
if ($j<$columns) {
echo $delim;
}
}
$i++;
if ($i<$tables) {
echo $delim;
}
}
echo "\n";
}
} while($this->items = $this->_model->getItems());