Vì bạn biết bạn đang ở trên Apache, sau đây là 2 ý tưởng.
ý tưởng đầu tiên (ý tưởng cái như vậy nhưng thú vị để suy nghĩ về ...):
Cookie được gửi đi với mọi yêu cầu trên máy chủ (bao gồm cho tất cả các hình ảnh vv). Khi người dùng đăng nhập thiết lập cookie bằng PHP và đặt tên là USERTOKEN
, sau đó đặt giá trị của nó thành md5 + muối của id của người dùng đó.
Chèn %{USERTOKEN}C
và %B
vào chỉ thị tùy chỉnh 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.
Bây giờ, bạn tạo một định dạng log tùy chỉnh mà trông như thế này:
LogFormat "%B %{USERTOKEN}C" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
Sau đó, bạn tạo một kịch bản để phân tích các php_bandwidth_log và bản đồ nó đến id của người dùng ban đầu.
Thật không may ý tưởng này không dễ dàng vì ai đó vẫn có thể truy cập nội dung trang web theo giả thuyết bằng cách không chuyển cookie (có thể). Dù sao, tùy thuộc vào tình huống của bạn, điều này có thể phù hợp với bạn, nếu không, một ý tưởng thay thế và tốt hơn là cơ bản định tuyến tất cả nội dung thông qua tập lệnh PHP để bạn có thể thực hiện bất kỳ kiểu ghi nào bạn muốn.
ý tưởng thứ hai (tốt hơn):
Vì vậy, tạo một file PHP có thể được gọi như /files.php?path=/blah/blah.jpg
này (quá đơn giản hóa ví dụ này, có thể được prettied lên với một quy tắc mod_rewrite) sau đó bên trong nó, bạn bạn có thể đăng nhập id của người dùng đó và theo dõi các tệp được truy cập. Đây là giả định bạn chỉ muốn theo dõi các tập tin. Điều này sẽ không theo dõi HTML được tạo trên trang - bạn có thể sử dụng ý tưởng ghi nhật ký Apache tùy chỉnh được đề cập trước đó nhưng sửa đổi nó một chút để có được thông tin đó.
Dưới đây là một số mã giả để giúp bạn có được ý tưởng:
if (!$hasSession) {
die("Invalid session");
}
$size = filesize($path);
insert_into_bandwidth_table($userId, $size);
header("Content-Type: ...");
readfile($path);
Sau đây là cách bạn có thể theo dõi các chỉ kích thước đáp ứng cho các script PHP thực hiện NHƯNG nó sẽ chỉ làm việc nếu bạn đang chạy PHP như một mô-đun.
Trong PHP của bạn, hãy thêm một cái gì đó như thế này. Về cơ bản này cho phép Apache để đọc biến này cho các mục đích viết nhật ký:
apache_note("PHP_USER_ID", 1234);
apache_note - apache_note - Nhận và thiết lập yêu cầu apache lưu ý
Mô tả: Chức năng này là một wrapper cho table_get và table_set của Apache. Nó chỉnh sửa bảng ghi chú tồn tại trong khi yêu cầu. Mục đích của bảng là cho phép các mô-đun Apache giao tiếp.
Read more here
Sau đó, trong cấu hình httpd.conf đăng nhập của bạn làm điều gì đó như thế này:
LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log
CustomLog "logs/php_bandwidth_log" php_bandwidth_log
Thông tin trên phiếu từ tài liệu:
%{Foobar}n The contents of note Foobar from another module.
Và ... chỉ nhận ra có một thay thế cho apache_note trong trường hợp bạn không chạy nó như là một mô-đun. mã PHP của bạn thay vì sẽ làm điều này:
apache_setenv('PHP_USER_ID', $userId, TRUE);
Sau đó đăng nhập của bạn sẽ sử dụng chỉ thị LogFormat này:
LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log
là tất cả mọi thứ trên cùng một máy chủ? – Clay
Và bạn đang chạy máy chủ web nào? Apache? hoặc cái khác? – Clay
@Clayton xin lỗi vì phản hồi muộn. Có mọi thứ trên cùng một máy chủ và sẽ sử dụng Apache –