2016-07-12 12 views
0

私は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メガバイト未満されて終わる、私のサーバーはそれを扱うように見えることはできません。私は周りを見回しましたが、私の正確な問題に対処するものは見ていません。

+0

簡単な解決法: 'fetchAll()'の代わりに 'fetch()'を使い、各行を一つずつCSVファイルに書き込むことができます。しかし、メモリが不足する前に134 MBを使用したことを考慮すると、コードに別の問題がある可能性があります。私はあなたのコードが不完全であるために伝えることができません。参照:http://stackoverflow.com/help/mcve –

+0

fetchAll()はあなたが知っている唯一のPDOメソッドですか? –

+0

@YourCommonSenseはい、私が知っているのは 'fetchALL()'だけです。私はかなりphpとpdoの新しいです。 – Mike

答えて

0

私はfetchALL()を使用していないことでは十分ではないメモリを持っていた問題が修正した:

$tsql = "Select Id,State,ProjectNumber,SubProjectNumber,PONumber 
      from pmdb.MaterialTracking order by State,ProjectNumber"; 
$hsql = "select Headings from TableHeadings where TableName = 'MaterialTracking' 
     and Headings != 'Edit' order by ID"; 

$filename = $_POST['ExportToExcel']; 

header("Content-Type: application/x-csv"); 
header("Content-Disposition: attachment; filename=$filename.csv"); 

/*******Start of Formatting for Excel*******/ 

//define separators (defines columns in excel) 
$sep = ","; 
$br = "\r\n"; //line break 

$getHeadings = $conn->query($hsql); 
$rHeadings = $getHeadings->fetchALL(PDO::FETCH_ASSOC); 

$headings = array(); 
$NumHeadings = count($rHeadings); 

for ($i = 0;$i < $NumHeadings; $i++) 
{ 
    $headings[] = $rHeadings[$i]["Headings"]; 
} 
//start of printing column names as names of SQL fields 
foreach($headings as $Heading => $value) 
{ 
    echo "$value" . $sep; 
} 
//end of printing column names 
echo $br; //separate the headers and the data 

foreach($conn->query($tsql) as $row) 
{ 
    for ($i = 0;$i < $NumHeadings;$i++) 
    { 
     $CommentPos = strpos($rHeadings[$i]["Headings"],"comment"); 
     $NewLines = array("\r\n","\n\r","\n","\r"); 
     $UseValue = str_replace($NewLines, " ",$row[$i]); 
     $UseValue = str_replace('"', "'",$row[$i]); 
     $pos = strpos($UseValue,","); 
     if ($CommentPos === FALSE || $pos === FALSE || isset($UseValue)) 
     { 
      echo '"' . $UseValue . '"' . $sep; 
     } 
     else 
     { 
      echo $UseValue . $sep . "Not quoted"; 
     } 
    } 
} 

をこの表の39個の列が実際に存在し、かつ合計(今日少なくとも)39812行の。これは私に必要なcsvを与えます。

関連する問題