私はMSSQL DBからデータを取得し、それをcsvにエクスポートするWebサイトを持っています。私が抱えている問題は、すべてのデータを引き出してメモリが不足していることです。エラー:Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 805 bytes) in D:\WebContent\engsys.corp.ftr.com\ExportToExcel.php on line 94
ストリームからphpからcsvへのエクスポート
データをすべてメモリに取り込む代わりにストリームする方法はありますか?ここでは、私は今それをやっている方法は次のとおりです、それはそれは大きなファイルではありません
$getqueries = $conn->query($tsql);
//$result = $getqueries->fetchALL(PDO::FETCH_ASSOC);
$filename = $_POST['ExportToExcel'];
header("Content-Type: application/x-csv");
header("Content-Disposition: attachment; filename=$filename.csv");
$getHeadings = $conn->query($hsql);
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC);
for ($i = 0;$i < $NumHeadings; $i++)
{
$headings[] = $rHeadings[$i]["Headings"];
}
foreach($headings as $Heading => $value)
{
echo "$value" . $sep;
}
//end of printing column names
echo $br;
$l = 0;
foreach($getqueries->fetch(PDO::FETCH_ASSOC) as $row)
{
$pos = strpos($row,$sep);
$CommentPos = strpos($rHeadings[$l]["Headings"],"comment");
$NewLines = array("\r\n","\n\r","\n","\r");
$UseValue = str_replace($NewLines, " ",$row);
if($pos === FALSE)
{
if($CommentPos === FALSE)
{
echo $UseValue . $sep;
}
else
{
echo '"' . $UseValue . '"' . $sep;
}
}
else
{
echo '"' . $UseValue . '"' . $sep;
}
$l++;
}
20メガバイト未満されて終わる、私のサーバーはそれを扱うように見えることはできません。私は周りを見回しましたが、私の正確な問題に対処するものは見ていません。
簡単な解決法: 'fetchAll()'の代わりに 'fetch()'を使い、各行を一つずつCSVファイルに書き込むことができます。しかし、メモリが不足する前に134 MBを使用したことを考慮すると、コードに別の問題がある可能性があります。私はあなたのコードが不完全であるために伝えることができません。参照:http://stackoverflow.com/help/mcve –
fetchAll()はあなたが知っている唯一のPDOメソッドですか? –
@YourCommonSenseはい、私が知っているのは 'fetchALL()'だけです。私はかなりphpとpdoの新しいです。 – Mike