Счетчик utm меток

Frost68

Новичок
Здравствуйте, вопрос такой. На главной странице у меня расположен код для сбора utm меток:
<input type="hidden" id="utm_campaign" name="utm_campaign" value="<?php $utm_campaign = $_GET['utm_campaign']; echo $utm_campaign; ?>">

Далее эта метка передается в обработчик методом Post через javascript

var utm_campaign = $("#utm_campaign").val();
$.ajax({

type: 'POST',
url: 'click.php',
data: {'utm_campaign': utm_campaign},
cache: false
});

Соответственно часть кода обработчика:
$source = $_POST['utm_campaign'];
if (empty($source)) {
$source = 'Не найдено';
}
Далее переменная отправляется в телеграмм,

$arr = array(
'Новый переход по рекламе!'=> "%0A",
'📋 IP: ' => $ip,
'🌎 Страна: ' => $country_code,
'📊 utm_campaign: ' => $source
);
foreach($arr as $key => $value) {
$txt .= $key.$value."%0A";
};

$sendToTelegram = fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");

Вопрос состоит в том, как посчитать количество переходов с одинаковой меткой, и отправить, чтобы сообщение приходило вида 📊 utm_campaign: utm метка (Здесь цифра которая показывает, в который раз перешли). В идеале было бы так:

Человек перешел с меткой, скрипт проверил есть ли она в списке, если нет то добавил, а если есть увеличил бы число у utm метки в сообщении на 1.
 

Фанат

oncle terrible
Команда форума
БД всегда есть, хотя бы sqlite

код здесь и так-то по щелчку пальцев никто писать не будет, а заведомо кривой - и подавно.
так что если хочется прям на файлах - то с этим не сюда
 

Squats

Новичок
Это ему надо, не вам же, так то конечно, лучше такие вещи в бд делать.
Но ничего плохого нет держать и в массивах, для такой крохотной задачи.
Когда, чтобы было из коробки sqlite может и не быть.
 

Squats

Новичок
Ну от сборки зависит.
Да и причем тут это, то.
Речь за то, что чем хуже хранить массив в файле?
Я так и не услышал ответ.
Затем последовало, что
...и потом приходи сюда спрашивать, почему файлы периодически обнуляются.
А почему они должны обнуляться?
Это тут причем?
И что вы имеете ввиду, под "Обнуляться"?
Там банально все в файле будет храниться:
array.php:
PHP:
defined('NO') || exit;
return [
    'key1'=>'value1',
    'key2'=>'value2',
    'key3'=>'value3'
];
index.php:
PHP:
define('NO', true);
$array = require_once 'array.php';
var_dump($array['key2']);
Что тут должно будет обнулиться?)
 

Фанат

oncle terrible
Команда форума
defined('NO') || exit; return [ 'key1'=>'value1', 'key2'=>'value2', 'key3'=>'value3' ];
вот это

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

ЗЫ, меня конечно умиляет это "defined('NO') || exit;" :)
Вы правда это пишете у себя в реальном коде?
 

Squats

Новичок
Так сказали, как будто я вам тайну открыл, что даже мол так можно написать =)
Все лучше закрыть тему.
В общем, используйте бд.
И не будет проблем =)
 

Фанат

oncle terrible
Команда форума
Так сказали, как будто я вам тайну открыл, что даже мол так можно написать =)
Ну в некотором роде. Я этой глупости уже лет 15 как не видел.
Скажите, а какого эффекта вы ожидаете от этого кода? Что изменится, если его не будет?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Это не клиника, это лет 20 опыта поддержки кода с разными алгоритмами.
Дело в том, что массив в файле хранить технически невозможно. В файлах бывает только строка.
Вот это - строка:
PHP:
<?php return [
    'key1'=>'value1',
];
include() парсит эту строку и приводит к массиву. Причем, этот парсинг не очень быстрый, небезопасный и с побочными эффектами. Результат парсинга кешируется в памяти, и при смене содержимого php-файлов процессы php-fpm видят изменения с задержкой.

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

Фанат

oncle terrible
Команда форума
Это не клиника
вообще-то мы с клиентом сейчас уже разговаривали про defined('NO')
он, правда, и здесь не понял, о чем речь, и решил что кого-то интересует его джидайский скилл по использованию логических операторов.

а про массивы он давно уже слился
 

Squats

Новичок
База нужна хранить пользовательские данные, а не пихать туда все подряд и схатывать боли с утечкой памяти при serialize и unserialize если начнем до кучи хранить объекты и какие-то нереальные комбинации и конструкции, нагородить огород и окунуться в бездну.
Так как массивы которые хранят в себе объекты и каллбеки, у нас вряд ли получится записать без сериализации этих данных, чтобы их записать можно было строкой.
var_export - это очень быстрое решение.
Ко всему еще и режим APC сможем задействовать.
Чего не будет работать в memcache и во многих других кешерах.
А require с опкешером очень любят такие файлики.
Но, чтобы записывать и редактировать такого рода массивы, уже не только var_export потребуется, но и написать ArrayDumper на основе данных, которые будут содержаться в ключах и значениях массива.
То есть метод export и import.
Я не призываю использовать массивы в качестве базы данных.
Лучше так не делать, если будут большие объемы, лучше хранить в бд.
А не писать phpbase =)
Так, что, лучше бд для данных, а логику выкинуть на массивы.
При этому у нас не будет огромных каких-то не реальных массивов, у нас будет лишь структура храниться которую мы получили из базы.
некий роутер, чтобы использовать в виде динамической или статической структуры массива, а также отдельно по частям если это function() {}.
Кому-то проще сделать тонну классов и объектов и думать, что это быстро работает. =)
 

AmdY

Пью пиво
Команда форума
При чём здесь объекты и сериализация. Конкретная задача - счётчик меток. В случае файлов тебе нужно следить за блокировками, как не терять данные под нагрузкой, чтобы файлик записался, чтобы данные не застряли в буфере или файловом кэше. БД такие вещи умеют из коробки.

п.с. Примечательный факт, только в php 8.1 появилась fsync
 
Сверху