2013-12-13 79 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