Как обрабатываются данные у счетчиков, как spylog?

1 234
M
На сайте с 04.12.2013
Offline
210
#21
Stek:
А чего не так с продакшеном ?

Вам, видимо, намекают на «неатомарность» сего действия. Действительно режут глаз эти три строчки.

Хостинг FOZZY ( https://u75.ru/fozzy ) / Выслушаю предложения на домены ( https://u75.ru/domains-for-sale ) / Домены и скрипт для коротких ссылок ( https://u75.ru/domains-for-shortcuts )
S
На сайте с 23.05.2004
Offline
299
#22

Думаю, что когда у ТС будет сотни конкурентных запросов в секунду, то к этому времени он код раз 10 перепишет и там будет все по другому.

Это просто мой личный сайт (https://phpdevs.com/) в моей подписи.
M
На сайте с 04.12.2013
Offline
210
#23
easywind:
мне не нужен самопал ни самосвал

Основные принципы вам уже раскрыли. Можете просто писать свой лог при помощи file_put_contents с флагом FILE_APPEND, можете обновлять запись в базе при помощи SET `hits`=`hits`+1 и т.п.

Помимо Content-Type при отдаче файлов также используется Content-Length, ну и контроль кэширования, как ранее писали, тут не будет лишним. Помимо gif/ico/jpg/png сбор статистики можно вешать на др. вспомог. файлы, прежде всего css/js. Как опять-таки уже было сказано, если вы не формируете картинку со стат. информацией, лучше просто читать существующие файлы, например у нас на сайтах можно подключить сбор статистики к любому статик файлу одного из предопред. типов, находящемуся в пределах паблик каталога сайта, создав счетчик и добавив к ссылке префикс вроде /promo, т.е. если есть файл /assets/logo.png, создается «счетчик» с именем assets/logo.png, обращение к кот. выполняеся по ссылкам /promo/assets/logo.png[тут еще могут быть доп. параметры для клонирования счетчика, т.е. фактически создания разных счетчиков на основе одного файла]. Как выше сказали, можно использовать ф-цию readfile, но а для больших файлов – служебные заголовки Web-севера, побуждающие его читать и отдавать файл самостоятельно (X-SendFile и т.п.).

mendel
На сайте с 06.03.2008
Offline
183
#24
_SP_:
php
_SP_:
народ своих демонов пишет

А на пхп что демонов писать нельзя?)

Узким местом всегда будет база.

В данном кейсе еще постобработка данных.

При грамотной архитектуре пхп в системе статистики не будет узким местом от слова совсем.

Stek:
Т.е. понимаю, что когда будет куча запросов в секунду, оно где то да перезапишется

Вы исходите из данной сферической задачи и своего сферического решения.

А вопрос несколько глубже.

Человек увидевший ваш пример начнет писать по образу и подобию.

В результате мы получим 50 файлов половина из которых по одной переменной как у вас, а половина аппендятся с разными данными. А так вероятность перезаписи увеличится даже без большой нагрузки. А еще можно так и дедлок словить.

Ну и просто некрасиво, да)

---------- Добавлено 10.05.2017 в 23:17 ----------

easywind:
Раз сказали "а" говорите и "б". Где читать?

Запускаем один процесс в качестве демона который получает запросы от воркеров и ведет наш лог. Например демон открывает себе файл-лог на запись и пишет по мене поступления запросов от воркеров.

Воркеры - либо из вебсервера (апач или нгинс или еще кто) либо напрямую с порта - шлют сообщения демону через библиотеки межпроцессных связей или банально по юникссокету.

Вместо файла можно взять какую-то базу данных, например монгу, структуру сделать максимально быструю на вставку, т.е. без индексов (скорее только с инкрементарным примари и все) и т.п.

Таким образом мы получаем быструю систему кушающую мало процессора, без проблем с дедлоками, с перезаписыванием информации и т.п., при этом способную держать высокую нагрузку.

Ну а сложную обработку мы пускаем отдельным процессом (или несколькими, там уже по задаче), выставив им низкий приоритет, чтобы они работали когда не загружены основные, быстрые воркеры.

Например этот фоновый процесс может из нашего лога переносить данные в нормализованную реляционную СУБД с кучей индексов для удобного поиска, суммировать всякие счетчики и т.п.

Разделять файл между демоном и воркером можно по разному, от тупого разделения данных в разные файлы по времени и разбора из "старого" периода, до псевдомногозадачности (например на генераторах) в самом демоне.

Stek:
Думаю, что когда у ТС будет сотни конкурентных запросов в секунду, то к этому времени он код раз 10 перепишет и там будет все по другому.

Вот в том то и дело что нет)

Лет пять назад я тоже так думал.

Но и через пять лет всё везде остается вот так вот, только помноженное на 48. :(

---------- Добавлено 10.05.2017 в 23:20 ----------

miketomlin:
также используется Content-Length

А зачем? Нет правда, зачем? Я честно подумал о нем в самом начале когда кеширование запрещал. Но потом решил что смысла в нем нет, ведь это лишь сообщает браузеру весь размер файла чтобы в процессе скачки видеть прогресс скачки. Но зачем? Это ведь не скачиваемый файл а часть страницы. Или я торможу где-то?

---------- Добавлено 10.05.2017 в 23:21 ----------

miketomlin:
префикс вроде /promo

Сами писали? С какой целью не поделитесь?

Шутку любишь над Фомой, так люби и над собой. (с) народ. Бесплатные списки читабельных(!) свободных доменов (http://burzhu.net/showthread.php?t=2976) (5L.com) Сайты, All inclusive. 5* (/ru/forum/962215)
S
На сайте с 23.05.2004
Offline
299
#25
mendel:
В результате мы получим 50 файлов половина из которых по одной переменной как у вас, а половина аппендятся с разными данными. А так вероятность перезаписи увеличится даже без большой нагрузки. А еще можно так и дедлок словить.

В эпоху пхп4 куча сиджей и тдсок работала на таком коде. Проблемы начинались при 50к+ в сутки трафа. Но там в in/out куча логики и расчетов. Плюс куда медленнее железо было. Так что на начальном этапе имхо не стоит на это внимание обращать.

Тем более что пхп все равно с flock работает криво, особенно между тредами. Иного более простого решения я не вижу, по крайней мере для инкремента значения.

H
На сайте с 21.08.2004
Offline
122
#26
mendel:

А вопрос несколько глубже.

наверное это вы углубляете ТС) посмотрите примеры на пхп.нет - там все просто и примитивно, как раз для начинающих в этом деле, к коим скорее всего и относится ТС (без обид).

Тогда уже давайте по-взрослому:

1)все обернуть в классы (чтобы как говорили можно было сразу пилить несколько типов счетчиков)

2)прописать все проверки файлов на существование, при отсутствии попытка создания

3)всякие lock на запись(пока не схватим какой-нибудь "дедлок":))

4)

......

nn) не забываем try catch

....

записать это дело еще пол-беды, а потом уже надо будет как-то отчеты формировать.

а потом выясниться, что ТС хотел всего лишь посчитать хиты одной странички:)

п.с. в защиту пхп: в свое время ставили многим клиентам cnstats - вполне тянул порядка 10-15К хостов в сутки + плюс к тому еще и код был в бейс64, но по-моему только у отчетов.

---------- Добавлено 10.05.2017 в 23:32 ----------

Вот без чтения файла прозрачный гиф 1*1 пх


Header("Content-type: image/gif");
print pack("CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC",0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3B);
Есть что-то, что мы не знаем, но узнать это мы не можем.
mendel
На сайте с 06.03.2008
Offline
183
#27
hrach:
посмотрите примеры на пхп.нет

Повторюсь: "Вот за это нас и не любят".

Примеры на пхп.нет это самое ужасное что может быть в пхп.

Люди берут и копируют примеры из документации.

И да, там есть куча советов по безопасности, по надежности и т.п.... в других разделах).

hrach:
наверное это вы углубляете ТС)

Да я ведь не для ТС пишу. ему число для себя в голове картинку сложить, писать счетчик он не будет. Просто у нас культура писания такая - нагуглил что-то похожее и копипастим. Работает - отлично.

hrach:
при отсутствии попытка создания

Ой сколько я с этим наелся...

Если то что должно быть - не существует, то только Exception и никаких вариантов. Все воркараунды только в ситуациях когда есть кто-то вне кто мог сделать что-то не так, и мы точно знаем что он хочет.

По умолчанию только смерть, и точка.

hrach:
п.с. в защиту пхп: в свое время ставили многим клиентам cnstats - вполне тянул порядка 10-15К хостов в сутки + плюс к тому еще и код был в бейс64, но по-моему только у отчетов.

А чего его защищать? И главное от кого?

опкеш, мемкеш, пхп7.1, нормальная архитектура, и я хочу видеть того клиента который сможет упереться в производительность пхп, не упершись в другие компоненты до того. Сервер с 128гб оперухи стоит от 100 баксов в месяц. Час нормального разработчика от 10баксов. На других языках за десять баксов будет совсем юниор который такого напишет что наш ТС лучше на пхп наваяет.

У пхп производительность давно перестала быть узким местом.

Тем более что демонизация пхп тоже давно не проблема. Он уже не течет давно. Изредка подтекают расширения, но это у всех бывает.

Кривости реализации тех или иных вещей да, вызывают вопросы.

Древности и ужасы в большинстве библиотек - частенько нервируют.

Засилие Милторгов и необходимость расшифровывать их код, да, проблема (самая главная), а вот производительность не проблема ни разу.

ПС: моя первая программа была написана в 89-м году, в возрасте 9-ти лет. На бейсике, на восьмибитках. Я потом очень долго и мучительно выбивал из себя GOTO. Честно. Проще сразу научиться писать правильно, чем потом переучиваться.

ППС: ООП уместен начиная с некоторого масштаба. А вот неверные паттерны нужно везде избегать. Если я увижу что человек проверяет наличие подстроки с помощью if(strpos($str, $needle)) .... то я буду ворчать, и ворчать громко, даже если у него строка в начале строки и невозможна))).

---------- Добавлено 11.05.2017 в 00:12 ----------

hrach:
Вот без чтения файла прозрачный гиф 1*1 пх

А потом другим это читать!

"Вот за это нас...."))

Здесь должна быть цитата Мартина Фаулера про любого дурака, но это уж слишком по капитански будет.

H
На сайте с 21.08.2004
Offline
122
#28
mendel:

А потом другим это читать!

Зачем читать всякую пургу, если смущает hex в коде, особенно на ночь глядя:)


89... я уже зарабатывал на обычном C и пайкой коаксилки для новелла:)
а как старались все паковать, чтобы уместиться 640кб в оперативке и 5" диске.

и без гото иногда сложно обойтись, особенно когда нет номеров строк,

и функцианальный подход тоже имеет свои плюсы:)

я тоже насмотрелся ужасов, когда в запросе вместо джоина в цикле вытаскивали по одной строке и что, мне теперь не спать?:) большинство таких проектов живет своей жизнью и не предоставляет никаких проблем, когда посещаемость равна 10 просмотрам в сутки. При серьезной нагрузке все отвалиться и править там будет нечего. у некоторых просто ошибка по программированию в ДНК:)

в примерах пхп.нет ничего страшного нет:) - там ниже куча комментов, но до них надо еще дорасти.

все зависит от того, чего мы хотим добиться и сколько времени готовы на это потратить - иногда легче камнем сбить, чем пушку заряжать.

E
На сайте с 21.09.2009
Offline
283
#29
mendel:
ему число для себя в голове картинку сложить,

+1

писать счетчик он не будет.

Почти так.

mendel:
Например этот фоновый процесс может из нашего лога переносить данные в нормализованную реляционную СУБД с кучей индексов для удобного поиска, суммировать всякие счетчики и т.п.

Тоже интересно. Пишут в одну базу или делят для скорости?

hrach:
в примерах пхп.нет ничего страшного нет - там ниже куча комментов, но до них надо еще дорасти.

+1 так и делается. Когда у проекта 10 посещений, то ничего не нужно. Есть проблемы? Тогда и читаются комменты и ищутся решения.

Из ответов я понял. что нужно писать "сырую" статистику, а потом ее обрабатывать.

По серверу. Что посоветуете? Какой софт? Конфигурация?

danforth
На сайте с 18.12.2015
Offline
153
#30

1. Ставите балансировщик.

2. Ставите сервер средней мощности с несколькими ядрами.

3. Собираете данные и пишите в Redis LPOP/LPUSH.

4. На другом конце другой сервер читает из очереди c каким-то чанком (по 100-200-1000) и распаралеленно обрабатывает данные, записывая их в базу.

5. Мониторите всю систему, в случае если где-то подходят лимиты по памяти и ЦПУ через API хостера поднимаете ещё сервер в кластер, до исчезновения нагрузки, а себе в телеграм высылаете лог-репорт о том кто и что жрет память/ЦПУ.

Собираете и обрабатываете чем угодно, пока это экономически оправдано. Я бы делал на компилируемых языках или JIT. Для PHP тут слишком много оверхеда, под задачу нужно выбирать правильный инструмент.

Junior Web Developer
1 234

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий