我正在尝试在上个月为数据库中的实例运行报告。然后,这将结果保存为.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文件。
这有什么明显的明显吗?或者可能是由于执行脚本所需的行数/时间? 感谢
答案 0 :(得分:0)
您是从命令行还是浏览器执行此操作?
1)如果您在浏览器中执行此操作,则可能会达到HTTP超时(通常为30秒)。你可以提高它,但最好从命令行执行PHP脚本
<?php
set_time_limit(600); // 10 minutes
2)你达到了你的记忆力限制。尝试在PHP文件的第一行添加它:
<?php
ini_set('memory_limit', '2048M');
实际上取决于服务器,服务器也应该接受通过php文件设置memory_limit。否则,您可以直接在网络服务器上进行配置。