@m4f1

Как отследить ошибки 404 и записать?

Нужна возможность отслеживать ошибки 404 и записывать их в бд (id, url, date) как это реализовать?
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
@DollaR84
Код писал давно, возможно можно улучшить и оптимизировать, но лень было пока этим заниматься, работает, что мне надо исполняет :)
Сначала в отдельный файл лучше скинуть несколько вспомогательных функций, чтобы не нагромождать код. Например, functools.php

<?php

    function finder($string, $substring) {
        $pos = stripos($string, $substring);
        if ($pos === false) {
            return false;
        } else {
            return true;
        }
    }

    function cut_rows($data) {
        $result = array();
        foreach ($data as $str) {
            $row = array();
            $str = explode(" ", $str);
            $concat = false;
            $temp = "";
            foreach($str as $substr) {
                if ((finder($substr, "[")) && (!finder($substr, "]"))) {
                    $temp = $substr;
                    $concat = true;
                } else if ((finder($substr, "]")) && ($concat == true)) {
                    $temp .= " ".$substr;
                    $row[] = $temp;
                    $concat = false;
                } else if (finder($substr, "\"")) {
                    $pos1 = stripos($substr, "\"", 0);
                    $pos2 = stripos($substr, "\"", ($pos1 + 1));
                if (!($pos1 === false) && ($pos2 === false) && ($concat == false)) {
                        $temp = $substr;
                        $concat = true;
                    } else if (!($pos1 === false) && ($pos2 === false) && ($concat == true)) {
                        $temp .= " ".$substr;
                        $row[] = $temp;
                        $concat = false;
                    } else {
                        $row[] = $substr;
                    }
                } else if ($concat == true) {
                    $temp .= " ".$substr;
                } else {
                    $row[] = $substr;
                }
            }
            $result[] = $row;
        }
        return $result;
    }

?>


Теперь можно написать сам скрипт, который можно назначить на исполнение в cron, например runner.php

<?php

    include('functools.php ');
    $data = file_get_contents("тут_путь_к_файлу_лога/access.log");
    $data = explode("\n", $data);
    array_pop($data);
    $data = cut_rows($data);

    // на данном этапе мы имеем массив строк, разбитый по колонкам
    // содержание запросов получается в колонке 4
    // у меня выбиралась статистика, поэтому готовой функции поиска запросов 404 я не делал, но думаю не составит труда составить подобную функцию
    // напомню, запрос будет в 4-м элементе данного массива $data
    // делаете перебор по нему и проверяете на необходимое вам
    // когда находите необходимый запрос - можно получить дополнительные данные следующие:
    // IP? с которого был запрос в элементе под индексом 0
    // дату можно получить под индексом 3? но она для всех данных в файле одинаковая, поэтому можно например так:
    $date = substr($data[0][3], 1, 11);
    // с 1 по 10 включительно символ - это именно дата: день, месяц и год
    // если надо время - оно в этой же строке, индексы вроде с 12 по 19 включительно, формат часы:минуты:секунды
    // но у каждого запроса оно свое. Тогда можно как-то так сделать:
    $time = substr($data[index][3], 12, 20);
    
    // ну а дальше подключение к БД и запись того что нужно, зависит от вашей структуры БД

?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman Куратор тега PHP
...в творческом отпуске...
логов сервера недостаточно?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы