2013-12-13 106 views
0

我正在嘗試爲上個月的數據庫中的實例運行報告。這會將結果保存爲.CSV文件。 我遇到的問題是,使用這個腳本我得到一個內部服務器錯誤500.
如果我在查詢中使用WHERE子句來過濾數據,我沒有得到這個問題,所以我知道查詢和函數創建.CSV文件正在一定程度上起作用。我得到一個完整的.CSV文件。但是,如果沒有額外的WHERE子句,文件似乎會填充到大部分數據的位置,但似乎會重新啓動,生成的文件只包含大約1/8的整體數據。
我期待在每月的.csv 函數CreateFile(){錯誤500內部服務器錯誤PHP腳本寫入CSV

/* *此方法將被用於創建csv文件 */

//-----Connection to DB-----// 

    $connectionInfo = array("UID" => $this->dbLogin, "PWD" => $this->dbLogin); 
    $conn = sqlsrv_connect($this->serverName, $connectionInfo)or die(print_r(sqlsrv_errors()));  

    //-----SQL Query-----// 

    $getList = sqlsrv_query($conn, $this->queryString, array(), $this->options)or die(print_r(sqlsrv_errors()));    

    //-----File creation-----// 

    $fp = fopen("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", 'w+'); 

    // //-----Add in first row that contains the column titles-----// 



    fputcsv($fp, $this->headerArray); 

    fclose($fp);  

    // // // -----Add data to the csv file-----// 

    $fp = fopen("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", 'a+'); 
    $data = array(); 
    while ($row = sqlsrv_fetch_array($getList, SQLSRV_FETCH_ASSOC)) { 

    $data['id'] = $row['id']; 
    $data['fullname'] = $row['fullname']; 
    $data['profile'] = $row['profile']; 
    $data['starttime'] = date_format($row['starttime'],'D jS M Y G:i'); 
    $data['endtime'] = date_format($row['endtime'], 'D jS M Y G:i'); 
    $endTime = date_format($row['endtime'], 'U'); 
    $startTime = date_format($row['starttime'], 'U'); 
      if($startTime == null || $startTime == ""){ 
     $startTime = $endTime; 
    } 
    $diff = ($endTime - $startTime); 
     $data['duration'] = round($diff/3600).gmdate(":i:s", $diff); 
      $data['hour'] =date_format($row['starttime'] ,'G'); 
    $data['ref'] = $row['ref']; 
    $data['endType'] = $row['endType']; 
    $data['problem'] = $row['problem']; 
    $data['solution'] = $row['solution']; 
    $data['type'] = $row['type']; 

    fputcsv($fp, array_values($data)); 
    }  

    fclose($fp); 

    sqlsrv_close($conn);  
} 

上述數據的40K +行是在我的類文件中用來創建.csv文件的函數。我正在使用的查詢是。

$this->queryString ="SELECT A.id 

     ,B.firstname + ' ' + B.lastname AS fullname 

     ,B.location 
     ,A.profile 
     ,A.siteid 
     ,A.accountnumber 
     ,A.starttime 
     ,A.endtime 
     ,A.ref 
     ,A.endType 
     ,A.problem 
     ,A.solution 
     ,A.type 

     FROM trend.report A 
     LEFT JOIN users.profile B 
     ON A.empId = B.id 

     WHERE DATEDIFF(M, A.endtime, GETDATE()) = 0 
     ORDER BY A.endtime DESC"; 

如果我添加例如

AND A.profile ='exampleProfile' 

我仍然得到20K +行,但我得到一個compeleted .CSV文件。

這件事顯而易見嗎?或者可能是由於執行腳本所需的行數/時間? 謝謝

+0

500錯誤通常會在網絡服務器的錯誤日誌中生成條目 –

回答

0

您是否從命令行或瀏覽器執行此操作?

1)如果在瀏覽器中執行此操作,可能會導致HTTP超時(通常爲30秒)。你可以提高它,但最好從命令行執行PHP腳本

<?php 
set_time_limit(600); // 10 minutes 

2)你達到你的內存限制。儘量提高它在你的PHP文件的第一行:

<?php 
ini_set('memory_limit', '2048M'); 

實際的頂部依賴於服務器,服務器也應該接受通過PHP文件設置memory_limit的。否則,你可以直接在網絡服務器上配置它。

+0

謝謝您的回覆,現在就試試這些。 但是,如何解釋從再次啓動文件的腳本,只有通過一些方法?我會期待剩下的結果,當它重新開始,但即時獲取前幾行。內存限制也許? – Shamrockonov