Php文件有时会导致500内部服务器错误

时间:2018-06-01 08:37:20

标签: php

所以,在我们公司,我们有分支机构。每个分支机构都有一组必须每天/每周/每月完成的任务。

我编写了一个脚本,总结了当前月份每个分支已完成的任务。现在,这可能需要很长时间,具体取决于数据量。 (通常随着月份的增加而增加)

月初,一切正常。接近月中/月末是问题开始发生的时间(通常因为有更多的日子需要检查更多的数据)。

这是调用函数来汇总所有内容的代码(也是引发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内部服务器错误。我不能为我的生活弄清楚发生了什么!代码工作,我已经在多个本地系统上测试过它。但似乎无法在我无法访问的实时服务器上运行。

6 个答案:

答案 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)等

首先,测试上述解决方案是否成功,然后使用错误记录应用程序,例如Bugsnagsentry

答案 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活动超时配置。