codeigniter — Как контролировать потребление пропускной способности пользователя в переполнении стека

Хорошо, я знаю, что это странная проблема и может быть невозможной, поэтому идеи будут оценены.

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

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

Будет использовать codeigniter, хотя я сомневаюсь, что это имеет значение.

Все будет на одном Linux-сервере с Apache, по крайней мере, на данный момент.

В идеале мне бы хотелось, чтобы решение не ограничивалось типом хостинга.

Будет использовать Google Cloud или Amazon AWS. Если решение ограничено облаком Google или AWS, оно будет работать.

6

Решение

Так как вы сказали, что находитесь на Apache, вот две идеи.

Первая идея (так себе идея, но интересно думать о …):

Файлы cookie отправляются с каждым запросом на сервер (включая все изображения и т. Д.). Когда пользователь входит в систему, установите куки с PHP и назовите его USERTOKEN затем установите значение md5 + соли идентификатора этого пользователя.

Вставить %{USERTOKEN}C а также %B в обычай LogFormat директивы.

%{Foobar}C  The contents of cookie Foobar in the request sent to the server.
Only version 0 cookies are fully supported.

%B          Size of response in bytes, excluding HTTP headers.

Теперь вы создаете собственный формат журнала, который выглядит следующим образом:

LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log

Затем вы создаете сценарий для анализа php_bandwidth_log и сопоставления его с идентификатором исходного пользователя.

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

Вторая идея (лучше):

Итак, создайте файл PHP, который можно назвать так /files.php?path=/blah/blah.jpg (упрощенно для этого примера, может быть связано с правилом mod_rewrite), затем внутри него вы можете записать идентификатор этого пользователя и отследить файлы, к которым обращались. Предполагается, что вы хотите отслеживать только файлы. Это не будет отслеживать HTML-код, сгенерированный на странице — вы, вероятно, могли бы использовать пользовательскую идею регистрации в Apache, упомянутую ранее, но немного ее изменить, чтобы получить эту информацию.

Вот некоторый псевдокод, который поможет вам понять:

if (!$hasSession) {
die("Invalid session");
}
$size = filesize($path);
insert_into_bandwidth_table($userId, $size);
header("Content-Type: ...");
readfile($path);

Ниже описано, как вы можете отслеживать только размер ответа для исполняемых сценариев PHP, НО это будет работать, только если вы используете PHP как модуль.

В ваш PHP добавьте что-то вроде этого. По сути, это позволяет Apache читать эту переменную в целях записи журнала:

apache_note("PHP_USER_ID", 1234);

apache_note — apache_note — получает и устанавливает примечания к запросу apache

Описание: Эта функция является оберткой для table_get и table_set Apache. Он редактирует таблицу заметок, которая существует во время запроса. Цель таблицы — позволить модулям Apache связываться.

Узнайте больше здесь

Затем в вашей конфигурации журнала httpd.conf сделайте что-то вроде этого:

LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log

Информация о записке из документов:

%{Foobar}n  The contents of note Foobar from another module.

И … только что понял, что есть альтернатива apache_note, если вы не используете его как модуль. Ваш код PHP вместо этого сделал бы это:

apache_setenv('PHP_USER_ID', $userId, TRUE);

Затем для входа в систему вы должны использовать эту директиву LogFormat:

LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log
2

Другие решения

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

Source:

Возможное решение:

Ограничение членства по пропускной способности

Отслеживание пропускной способности пользователя с приложением PHP

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector