Хедър на потребителски агент - съкращение за съхранение на mysql

Според тази тема и по-специално тази публикация: https://stackoverflow.com/a/6595973/1125465, Microsoft като винаги се показва. Размерът на потребителския агент може да бъде наистина, наистина огромен.

Работя върху малка библиотека за посетители в php и искам да съхранявам информация за потребителския агент. Не мога да взема решение относно типа и дължината на данните.

Така че въпросът ми е: имате ли някакви идеи как да съкратите потребителския агент до някакъв "нормален" размер? (например 256 знака).


Забележка: Разработчиците използват потребителски агенти за откриване на потребителския браузър и операционни системи. Така че според свързания пример, всички глупави числа от M$ са просто... Просто са. Както винаги, лази ни по нервите. Така че идеята е да се направи функция, която съкращава низа на потребителския агент, но не губи важната информация.

Мисля, че такава функция трябва:

  • Не зависи от бъдещи актуализации и нови браузъри (без твърдо кодирани низове)
  • Имайте прост механизъм, който решава какво да изтриете (например, ако има число, запетая, число, запетая, число, запетая, число, ..., може да го изтрие, не е интересно).
  • И накрая, ако всички операции все още водят до твърде дълъг потребителски агент (да кажем 256 знака), няма какво повече да се прави, така че просто отрежете останалите. Това е един на милион, така че данните могат да бъдат загубени.

Допълнителна забележка: Знам, че мога да направя функция, която получава браузъра и типа на операционната система от потребителския агент и запазва само тези стойности. Но както винаги такива функции имат твърдо кодирани имена и ако браузърът не бъде разпознат, той например връща „Неразпознат браузър“. Така че в бъдеще всеки трябва да помни за актуализирането на тези функции. И ако запазим съкратен потребителски агент, информацията не е Не е загубено (тъй като само скриптът, който чете базата данни, трябва да има нова система за разпознаване). Но записите в базата данни са надеждни и последователни, както трябва да бъде.


АКТУАЛИЗАЦИЯ: Тъй като трябва да има някакъв код и има проблем с идеята, а не проблемът със съществуващия код, ще напиша някакъв минимален код, който написах досега ;) :

<?php
    function shorten($useragent, $maxsize = 256) {
        $shorten = $useragent;
        ... // ?
        $shorten = substr($shorten, 0, $maxsize); // the "last hope" cut
        return $shorten;
    }
    echo shorten($_SERVER['HTTP_USER_AGENT']);
?>

person Jacek Kowalewski    schedule 19.05.2014    source източник
comment
Можете да извлечете определена информация от него, като използвате preg_replace() и просто да съхраните това, от което се нуждаете.   -  person ThePixelPony    schedule 19.05.2014


Отговори (1)


Няма правила за низовете на User-Agent, така че няма начин да се създаде напълно правилен и устойчив на бъдещето анализатор. Има обаче общ модел:

User-Agent: <engine-string> <engine-string> ...

Където engine-string има форма:

<agent-name> (<comment>; <comment>; ...)

Всеки низ на двигателя (просто го нарекох така според моите разбирания, това може да не е правилно) може или не може да има коментари.

Например:

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

(Това е единичен низ, току-що го разделих на редове.) Изглежда, когато някой прави разклонение на двигател на браузър, той просто добавя своето нещо към края. Така че имаме някакъв абстрактен браузър "Mozilla" (наследство от "Първата война на браузърите"), който си мисли, че е на iPhone. Тогава виждаме, че има WebKit (който помни, че е роден като KHTML преди известно време). След това има някаква модификация Version/6.0, която след това беше модифицирана в Mobile/10A5376e, който стана Safari/8536.25, което най-накрая разкрива тайната, че това всъщност е мобилен Google бот.

Друг пример:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)

Това е един двигател, но има много какво да се каже в скоби.

Така че общото наблюдение е:

  • последните низове на двигателя са най-важни,
  • последните коментари в скоби са по-малко важни.

Имайки предвид това, моята идея би била да анализирам низа в тези токени на машината и коментарите, след което от всяка секция на машината да изхвърля коментари, започвайки от, да речем, петата. След това, ако все още не е достатъчно, изхвърлете разделите на двигателя, като започнете от втория (първият често е абстрактна "Mozilla", но често има полезни коментари; също понякога всъщност е нещо конкретно, особено за уеб роботи).

Когато анализираме, трябва да вземем предвид, че понякога може да има низове, които не следват този формат. Те могат да бъдат запазени в лог файл за по-късна проверка и след това просто да бъдат изрязани до необходимата дължина, за да се поберат в базата данни.

person Gas Welder    schedule 20.06.2014
comment
Благодаря ви много за отговора. Той е единственият, но съм сигурен, че никой няма да изпълни тази тема по-широко. +1, прието. С най-добри пожелания и наистина оценявам вашата работа и знания. Благодаря! - person Jacek Kowalewski; 20.06.2014