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

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

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

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

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

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

Will be using either Google cloud or amazon AWS. If the solution is limited to google cloud or aws, it will work.

Ответы (2)

Поскольку вы сказали, что используете Apache, вот две идеи.

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

Файлы cookie отправляются с каждым запросом на сервере (включая все изображения и т. Д.). Когда пользователь входит в систему, установите файл 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

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

Source:

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

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

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

2022 WebDevInsider