错误500内部服务器错误PHP脚本写入CSV

时间:2013-12-13 12:53:25

标签: php sql-server-2008 tsql csv

我正在尝试在上个月为数据库中的实例运行报告。然后,这将结果保存为.CSV文件。 我遇到的问题是,使用此脚本,我收到内部服务器错误500 如果我在查询上使用WHERE子句来过滤掉数据,我没有遇到这个问题所以我知道查询和创建.CSV文件的函数在某种程度上是有效的。我得到一个完全填充的.CSV文件。但是,如果没有附加的WHERE子句,文件似乎填充到包含大部分数据的点,但随后似乎重新启动,结果文件仅包含大约1/8的总数据。
我期待每月.csv中有40,000多行数据 function createFile(){

/ *         *此方法将用于创建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);    
}

以上是我的类文件中用于创建.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 +行,但我得到了一个完整的.CSV文件。

这有什么明显的明显吗?或者可能是由于执行脚本所需的行数/时间? 感谢

1 个答案:

答案 0 :(得分:0)

您是从命令行还是浏览器执行此操作?

1)如果您在浏览器中执行此操作,则可能会达到HTTP超时(通常为30秒)。你可以提高它,但最好从命令行执行PHP脚本

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

2)你达到了你的记忆力限制。尝试在PHP文件的第一行添加它:

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

实际上取决于服务器,服务器也应该接受通过php文件设置memory_limit。否则,您可以直接在网络服务器上进行配置。