所以,在我们公司,我们有分支机构。每个分支机构都有一组必须每天/每周/每月完成的任务。
我编写了一个脚本,总结了当前月份每个分支已完成的任务。现在,这可能需要很长时间,具体取决于数据量。 (通常随着月份的增加而增加)
月初,一切正常。接近月中/月末是问题开始发生的时间(通常因为有更多的日子需要检查更多的数据)。
这是调用函数来汇总所有内容的代码(也是引发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);
?>
它调用一个名为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"));
}
现在当我调用此函数时,它会挂起大约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
如果没有日志记录,则会引发500内部服务器错误。我不能为我的生活弄清楚发生了什么!代码工作,我已经在多个本地系统上测试过它。但似乎无法在我无法访问的实时服务器上运行。
答案 0 :(得分:4)
一些旧的调试时间。 500错误是服务器错误,所以它可能是任何东西。评论一切,他们每行/块打开它。如果错误触发并且它是一个函数,请进入该函数重复。
在某些时候,您会找到触发此错误的行。从那时起,您尝试找出为什么该行触发警告。
你可能很幸运,并在日志中找到它(或者有时它是完整的日志,它会发生)。您可能想要检查apache和mysql日志,因为它也可能是数据库问题。
答案 1 :(得分:3)
使用
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
找到你的错误。
答案 2 :(得分:0)
500内部服务器错误是服务器错误,这是由于某些原因apache无法执行部分脚本引起的。
检查错误的最佳方法是在apache文件夹中打开错误日志文件并跟踪该行。
这对你来说难以解决我猜
答案 3 :(得分:0)
错误500非常难以处理,并且由于许多原因而引起,例如:
1).htaccess配置错误
2)Apache配置错误
3)PHP depcrated函数
4)内存泄漏
5)服务器弱
6)等
答案 4 :(得分:0)
对于所有未定义的通知,可以将其值设置为0(如果未设置)。
例如:-
$instance["tasks"]["total"] += 1;
在这种情况下,如果尚未设置 $ instance [“ tasks”] [“ total”] 的值,在这种情况下,您会遇到不确定的通知。
因此,解决方案可能是:-
if (!isset($instance["tasks"]["total"])) {
$instance["tasks"]["total"] = 0;
}
$instance["tasks"]["total"] += 1;
在有这样的值分配的任何地方都采用这种逻辑,应该可以解决未定义的问题。
对于未定义的偏移量问题,您可以再次检查值是否在以下位置设置:-
例如:-
if(!$instance["tasks"]["monthly"][$task["department"]][$task["id"]]["completed"]) {
$instance["tasks"]["monthly"][$task["department"]][$task["id"]]["completed"] = 0;
}
如果您
的值,那么您会遇到未定义的偏移通知
$ instance [“任务”] [“每月”] [$任务[“部门”]] [$任务[“ id”]] [“已完成”]
未设置,因此解决方案可能是:-
if (isset($instance["tasks"]["daily"][$task["department"]][$task["id"]]["completed"]) && !$instance["tasks"]["daily"][$task["department"]][$task["id"]]["completed"]) { $instance["tasks"]["daily"][$task["department"]][$task["id"]]["completed"] = 0; }
答案 5 :(得分:-4)
我解决了这个问题。这是IIS FastCGI活动超时配置。