2012-04-19 2 views
0

私は現在、Webアプリケーションを介して生成されたレポートのCSV機能への新しいエクスポートをテストしています。関連するコードはこのようになります。特別な出力ストリームphp:// outputに渡すことができるデータの量には制限がありますか?

$my_report_data = ReportDAO::runCampaignAnalysis($campaign_id, $start_date, $end_date); 

$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setHttpHeader('Content-Type', 'application/vnd.ms-excel'); 
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename='export.csv'); 

$outstream = fopen("php://output", "w"); 

function __outputCSV(&$vals, $key, $filehandler) { 
    $retval = fputcsv($filehandler, $tempArray); 
    if($retval == FALSE) { 
     error_log('Uh oh, spaghetti o!'); 
     error_log('The current line being processed is: ' . join('|', $vals)); 
    } 
} 

array_walk($my_report_data, "__outputCSV", $outstream); 
fclose($outstream); 

return sfView::HEADER_ONLY; 

$ my_report_data単にフォームseen hereの多次元配列です。

このコードは小さなデータセットで完全に機能します。 100行以下(カットオフが残念ながらどこにあるかはわかりません)。より大きなデータセットを使用する。ただし、CSVにエクスポートしようとするとブラウザで[ファイルを開く/保存]ダイアログが表示されるのではなく、Webページに未処理のレポートの内容が表示されます。

Firefox用の「ライブHTTPヘッダー」プラグインでHTTPヘッダーを調べましたが、大きなデータセットではヘッダーが正しく設定されず、「text/html」と表示されます。 charset = utf-8 'ではなく' application/vnd.ms-excel 'となります。非常に奇妙な。

答えて

1

奇数:定期的に出力バッファをフラッシュしてみてください。私は同様のエラーを防ぐためにこれを行う必要があることを発見しました。線に沿って何か:$lenは行数である

if($len > 250){ $len = 0; if(ob_get_length()) ob_flush(); } 

。あなたのarray_walkにそれを合わせるのが面倒ですが、それは助けになるかもしれません。

+0

あなたの提案をありがとうFemiしかし、私の現在のソリューションにそれを適合させることはむしろ面倒だと指摘しました。バッファをフラッシュすることで、ヘッダーの問題が「text/html」に変わってしまうという不思議な問題を解決する方法は不明です。 FWIWでは、私はそれを早期に成功させました。 – freakwincy

0

私は可能な解決策を見つけたと信じています。それがなぜ機能するか完全にはわからない。しかしそれはそうです。 clearHttpHeadersの呼び出しの前に次のコードを追加しました。

チャームのように働いていました。

関連する問題