所以,在我们公司我们有分支机构。每个分支机构都被赋予了一组必须每天/每周/每月完成的任务。
我编写了一个脚本,总结了当月每个分支已完成的任务。现在,这可能需要很长时间,具体取决于数据量。(通常随着月份的推移而增加)
月初,一切都运转良好。接近月中/月底时,问题开始发生(通常是因为有更多的数据需要检查,因为有更多的天数)。
这是调用函数来总结所有内容的代码(也是引发 500 错误的页面):
<?php
ini_set('max_execution_time', 3600);
require_once('../../Connections/newConn.php');
require_once('../../Library/new/branchTaskSummary.php');
header('Content-Type: application/json');
$summary = array();
if(isset($_GET['month']) && isset($_GET['year']) && isset($_GET['update'])) {
global $conn;
$update = $_GET['update'] == 1;
$month = $_GET['month'];
$year = $_GET['year'];
if(!$update) {
$query = $conn->prepare("SELECT data_json, DATE_FORMAT(last_updated, '%d/%m/%Y %H:%i') AS last_updated FROM branchtasksummarydata WHERE month = ? AND year = ?");
$query->bind_param('ii', $month, $year);
$query->execute();
$result = $query->get_result();
if($result->num_rows > 0) {
$summary = $result->fetch_assoc();
} else {
$summary = summariseEverything($month, $year);
}
} else {
$summary = summariseEverything($month, $year);
}
}
echo json_encode($summary);
?>
Run Code Online (Sandbox Code Playgroud)
它调用一个名为 的函数summarizeEverything,这是所有魔法发生的地方。
这是该函数的代码:
function summariseEverything($month, $year) {
global $conn;
$now = new DateTime();
$data = array();
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$start = sprintf("%s-%s-%s", $year, $month, "01");
$end = sprintf("%s-%s-%s", $year, $month, $daysInMonth);
//Get all branches
$branches = getBranches();
//Get all tasks
$dailyTasks = getAllTasks(1, $start, $end);
$weeklyTasks = getAllTasks(2, $start, $end);
$monthlyTasks = getAllTasks(3, $start, $end);
//Get dates
$dailyDates = Calendar::getDaysBetween($start, $end);
$weeklyDates = Calendar::getWeeksBetween($start, $end);
$monthlyDates = Calendar::getMonthsBetween($start, $end);
foreach($branches as $branch) {
$instance = array("id" => $branch["id"], "name" => $branch["name"], "area" => $branch["area"], "finance_area" => $branch["finance_area"], "company" => $branch["company"], "icb" => $branch["icb"], "tasks" => array());
$instance["tasks"]["completed"] = 0;
$instance["tasks"]["daily"]["completed"] = 0;
$instance["tasks"]["weekly"]["completed"] = 0;
$instance["tasks"]["monthly"]["completed"] = 0;
//Do daily tasks.
foreach($dailyTasks as $task) {
foreach($dailyDates as $date) {
$dateObj = new DateTime($date);
if($dateObj > $now) {
break;
}
$isWorkingDay = true;
Calendar::isBankHoliday($dateObj->format('Y-m-d'), &$Colour, &$Msg, &$isWorkingDay);
Calendar::isWeekend($dateObj->format('Y-m-d'), &$Colour, &$Msg, &$isWorkingDay);
$dayName = $dateObj->format("l");
$isOpen = branchIsOpen($branch, $dayName);
if($isWorkingDay && $isOpen) {
$instance["tasks"]["total"] += 1;
$instance["tasks"]["daily"]["total"] += 1;
$instance["tasks"]["daily"][$task["department"]]["total"] += 1;
$instance["tasks"]["daily"][$task["department"]][$task["id"]]["total"] += 1;
$completed = taskCompleted($branch["id"], $task["id"], $date." 00:00:00", $date." 23:59:59");
if($completed) {
$instance["tasks"]["completed"] += 1;
$instance["tasks"]["daily"]["completed"] += 1;
$instance["tasks"]["daily"][$task["department"]]["completed"] += 1;
$instance["tasks"]["daily"][$task["department"]][$task["id"]]["completed"] += 1;
}
}
}
if(!$instance["tasks"]["daily"][$task["department"]][$task["id"]]["completed"]) {
$instance["tasks"]["daily"][$task["department"]][$task["id"]]["completed"] = 0;
}
if(!$instance["tasks"]["daily"][$task["department"]]["completed"]) {
$instance["tasks"]["daily"][$task["department"]]["completed"] = 0;
}
}
//Do weekly tasks.
foreach($weeklyTasks as $task) {
foreach($weeklyDates as $date) {
$instance["tasks"]["total"] += 1;
$instance["tasks"]["weekly"]["total"] += 1;
$instance["tasks"]["weekly"][$task["department"]]["total"] += 1;
$instance["tasks"]["weekly"][$task["department"]][$task["id"]]["total"] += 1;
$completed = taskCompleted($branch["id"], $task["id"], $date["start"], $date["end"]);
if($completed) {
$instance["tasks"]["completed"] += 1;
$instance["tasks"]["weekly"]["completed"] += 1;
$instance["tasks"]["weekly"][$task["department"]]["completed"] += 1;
$instance["tasks"]["weekly"][$task["department"]][$task["id"]]["completed"] += 1;
}
}
if(!$instance["tasks"]["weekly"][$task["department"]][$task["id"]]["completed"]) {
$instance["tasks"]["weekly"][$task["department"]][$task["id"]]["completed"] = 0;
}
if(!$instance["tasks"]["weekly"][$task["department"]]["completed"]) {
$instance["tasks"]["weekly"][$task["department"]]["completed"] = 0;
}
}
//Do monthly tasks.
foreach($monthlyTasks as $task) {
foreach($monthlyDates as $date) {
$instance["tasks"]["total"] += 1;
$instance["tasks"]["monthly"]["total"] += 1;
$instance["tasks"]["monthly"][$task["department"]]["total"] += 1;
$instance["tasks"]["monthly"][$task["department"]][$task["id"]]["total"] += 1;
$completed = taskCompleted($branch["id"], $task["id"], $date["start"], $date["end"]);
if($completed) {
$instance["tasks"]["completed"] += 1;
$instance["tasks"]["monthly"]["completed"] += 1;
$instance["tasks"]["monthly"][$task["department"]]["completed"] += 1;
$instance["tasks"]["monthly"][$task["department"]][$task["id"]]["completed"] += 1;
}
}
if(!$instance["tasks"]["monthly"][$task["department"]][$task["id"]]["completed"]) {
$instance["tasks"]["monthly"][$task["department"]][$task["id"]]["completed"] = 0;
}
if(!$instance["tasks"]["monthly"][$task["department"]]["completed"]) {
$instance["tasks"]["monthly"][$task["department"]]["completed"] = 0;
}
}
$data["branches"][] = $instance;
}
$json = json_encode($data);
//Check if data exists for this month & year before inserting into DB.
$query = $conn->prepare("SELECT summaryPK FROM branchtasksummarydata WHERE month = ? AND year = ?");
$query->bind_param('ii', $month, $year);
$query->execute();
$result = $query->get_result();
$exists = $result->num_rows > 0;
if($exists) {
//Data already exists, so let's update it.
$query = $conn->prepare("UPDATE branchtasksummarydata SET data_json = ?, last_updated = ? WHERE month = ? AND year = ?");
$query->bind_param('ssii', $json, $now->format("Y-m-d H:i:s"), $month, $year);
$query->execute();
} else {
//No data exists, so we will insert it.
$query = $conn->prepare("INSERT INTO branchtasksummarydata (year, month, last_updated, data_json) VALUES(?, ?, ?, ?)");
$query->bind_param('iiss', $year, $month, $now->format("Y-m-d H:i:s"), $json);
$query->execute();
}
return array("data_json" => $json, "last_updated" => $now->format("d/m/Y H:i"));
}
Run Code Online (Sandbox Code Playgroud)
现在,当我调用此函数时,它会挂起大约 6/7 分钟,然后才会出现内部服务器错误。
有趣的是,我在本地机器上测试它并且运行良好。但是,在实时服务器上,它会抛出错误。
编辑
回来尝试解决这个问题后,我打开了我可以打开的所有错误日志记录,它只是在每次循环分支迭代时给我这些:
Notice: Undefined index: total in C:\WS\JMIS\Library\new\branchTaskSummary.php on line 61
Notice: Undefined index: total in C:\WS\JMIS\Library\new\branchTaskSummary.php on line 62
Notice: Undefined offset: 9 in C:\WS\JMIS\Library\new\branchTaskSummary.php on line 63
Notice: Undefined index: total in C:\WS\JMIS\Library\new\branchTaskSummary.php on line 63
Notice: Undefined offset: 12 in C:\WS\JMIS\Library\new\branchTaskSummary.php on line 64
Notice: Undefined index: total in C:\WS\JMIS\Library\new\branchTaskSummary.php on line 64
Run Code Online (Sandbox Code Playgroud)
如果没有日志记录,它会抛出 500 内部服务器错误。我一生都无法弄清楚发生了什么事!该代码有效,我已经在多个本地系统上对其进行了测试。但似乎无法在我无权访问的实时服务器上工作。
使用
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
找到你的错误。
| 归档时间: |
|
| 查看次数: |
6806 次 |
| 最近记录: |