2016-01-01 17 views
6

Ok Tôi biết đây là vấn đề lạ và có thể không thực hiện được, vì vậy ý ​​tưởng sẽ được đánh giá cao.Cách giám sát mức tiêu thụ băng thông của người dùng trong PHP

Dù sao, tôi muốn tìm hiểu số lượng băng thông tôi đang cung cấp cho mỗi người dùng. Tôi xác định người dùng khi anh ấy đăng nhập vào trang web.

Vì vậy, về cơ bản cho mọi yêu cầu, tôi muốn biết có bao nhiêu băng thông được sử dụng bởi yêu cầu đó. Và nếu người dùng đăng nhập vào thời điểm đó, tôi sẽ thêm số tiền vào tài khoản của anh ấy.

Sẽ sử dụng trình viết mã, mặc dù tôi nghi ngờ rằng sẽ tạo sự khác biệt.

Mọi thứ sẽ có cùng một máy chủ dựa trên Linux với Apache, ít nhất là bây giờ.

Lý tưởng nhất là tôi muốn một giải pháp không giới hạn đối với loại lưu trữ.

Sẽ sử dụng Google cloud hoặc amazon AWS. Nếu giải pháp được giới hạn trong google cloud hoặc aws, nó sẽ hoạt động.

+0

là tất cả mọi thứ trên cùng một máy chủ? – Clay

+0

Và bạn đang chạy máy chủ web nào? Apache? hoặc cái khác? – Clay

+0

@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 –

Trả lời

2

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%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 
+1

Cảm ơn người đàn ông. Đây là những ý tưởng tuyệt vời! Một ít khám phá theo hướng này có thể giải quyết được vấn đề. Một ý tưởng khác dựa trên ý tưởng cookie. Chúng tôi biết người dùng nào đang truy cập trang web qua IP nào vào thời điểm nào.Chúng tôi có thể sử dụng thông tin này khi phân tích cú pháp tệp nhật ký apache (băng thông in được sử dụng với ip trong tệp nhật ký). Điều đó sẽ giải quyết vấn đề cookie trống nhưng làm cho những thứ khác phức tạp hơn. –

+0

Nếu bạn đã đi với ý tưởng thứ hai, tôi đã thực hiện chỉnh sửa về cách bạn có thể yêu cầu kích thước cho các tập lệnh PHP được thực thi. Nhược điểm là nó sẽ buộc bạn phải sử dụng PHP như một mô-đun có thể không được mong muốn. Chúng tôi đã làm điều này ở một công việc trước đó mặc dù và nó làm việc tốt mặc dù. Vì vậy, định tuyến + tệp đó sẽ làm cho nó để bạn luôn có id người dùng. – Clay

+0

aha ... có vẻ như bạn có thể sử dụng 'apache_setenv' thay vì' apache_note' mà tôi tin rằng sẽ bỏ qua sự cần thiết phải có PHP như một mô-đun. một lần nữa, apache_note/apache_setenv sẽ chỉ có thể ghi lại kích thước của các tập lệnh PHP được chạy trong phiên không phải bất kỳ tệp được tải bên ngoài nào không phải là các tập lệnh PHP. – Clay

0

Bạn có thể sử dụng API của amazon để kiểm tra mức sử dụng băng thông, thay vì bằng nhật ký. như bạn đã nói rằng bạn đang sử dụng s3 để quản lý tài sản , sẽ tốt nếu bạn tạo một nhóm mới cho mỗi người dùng và kiểm tra mức sử dụng băng thông và sau đó giới hạn tài khoản nếu anh ta/cô ấy vượt quá giới hạn đó.

Source: 

Giải pháp:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

Một nhóm mới cho người dùng bao giờ? Yeesh. AWS giới hạn bạn thành 100 nhóm theo mặc định. – ceejayoz

Các vấn đề liên quan