@m4f1

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

Нужна возможность отслеживать ошибки 404 и записывать их в бд (id, url, date) как это реализовать?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 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
...в творческом отпуске...
логов сервера недостаточно?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Vigrom Москва
До 150 000 руб.
SaveTime Москва
от 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.
15 нояб. 2019, в 01:36
10000 руб./за проект
15 нояб. 2019, в 01:32
5000 руб./за проект