2012-12-01 21 views
5

Có tất cả các cuộc thảo luận về lưu trữ lượt xem trang cho bài viết hoặc video trong cơ sở dữ liệu, nhưng dường như tôi không tìm thấy bất kỳ thông tin nào về việc lưu trữ lượt xem trang hàng ngày . Ví dụ: DeviantArt hiển thị cho bạn 15 ngày hoặc hơn trong quá khứ và số lần xem trang mà mỗi người xem trong một biểu đồ nhỏ, cũng như tổng số lần xem trang cho tiểu sử.Cách hiệu quả nhất để lưu trữ lượt xem trang hàng ngày, cũng như tổng số

Pageviews example

Bạn có thể xem ở trên chính xác những gì tôi đang cố gắng để đạt được, và DeviantArt làm điều đó trên một quy mô rất lớn khi họ nhận được hàng triệu lượt truy cập.

Tôi đang sử dụng CodeIgniter trên PHP và MySQL

+0

Tôi đã cập nhật câu trả lời của mình. Trong tò mò, trang web là gì? Tôi rất ngạc nhiên khi bạn mong đợi hàng triệu lượt truy cập mỗi ngày. – Marvin

+0

Của nó chủ yếu là ra quan tâm, tôi sẽ không cần phải sử dụng một kịch bản như thế này ngay bây giờ, nhưng tôi bắt đầu làm việc trên một số trang web lớn hơn vì vậy có lẽ sẽ cần nó trong tương lai :) – Adam

Trả lời

5

Bạn có thể có một hàng cho mỗi ngày sau đó tăng số lần khi nó được xem .

INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1; 

Và một kịch bản PHP ...

mysql_query("INSERT INTO views (day,views) VALUES (CURDATE(),1) ON DUPLICATE KEY UPDATE views=views+1;"); 

này sử dụng một bảng gọi là 'điểm' và 'ngày' 2 hàng và 'views'.

Xem this article để biết thêm thông tin.

4

tôi không sử dụng CodeIgniter nhưng đây là cách bạn có thể làm điều này trong php thẳng.

Về cơ bản, bạn có thể sử dụng phiên để ghi lại mỗi lượt truy cập vào trang web của mình và ghi lại yêu cầu trang của họ hoặc bạn có thể chỉ cần ghi lại từng lần truy cập trên trang. Tùy chọn đầu tiên cung cấp cho bạn thêm thông tin (số lần truy cập duy nhất được tạo, số lượt truy cập từ khách truy cập quay lại, v.v.) nhưng cần nhiều lập trình hơn để thiết lập và yêu cầu quản lý phiên người dùng. Vì vậy, mục đích của bạn tôi sẽ giải thích tùy chọn 2.

SQL:

Table 'pageViews' 
Id - Integer, auto Increment, primary key 
page - varchar(150) 
datetime - datetime 

Trên trang bạn đang theo dõi, bạn sẽ thêm:

$query2 = "INSERT INTO `pageViews` (page, datetime) VALUES ('".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")"; 
    $result2 = //insert DB connection etc. to apply update to DB 

Sau đó bạn có thể lấy các hàng từ db dựa trên trang và dấu ngày giờ, đếm kết quả và hiển thị nó bằng cách sử dụng canvas html5. Hoặc, bởi vì mỗi lần truy cập đều có ngày giờ, bạn có thể chia nhỏ hơn nữa thành giờ trong ngày, v.v.

Tôi hy vọng điều này sẽ hữu ích.


Để sửa đổi điều này cho các bộ đếm hàng ngày đơn giản, hãy thêm cột bổ sung gọi là 'lượt xem' chỉ là số nguyên. Sau đó, trên trang đặt một kiểm tra để xem nếu có một hàng cho trang hiện tại cho ngày hôm nay trong db. Nếu vậy, sau đó nhận giá trị hiện tại của lượt xem và tăng giá trị đó và bán lại cho DB.

Đối với tổng số lượt xem, tôi có thể tạo một bảng khác có cùng cột nhưng không phải với cột ngày giờ. Sau đó trên trang của bạn, bạn cũng tăng giá trị lượt xem cho trang hiện tại trong bảng mới.

Điều này sẽ sáng nhanh. Sự cân bằng là mất chi tiết. Vì vậy, đây là MySQL và PHP cho 3 tùy chọn này:

MySQL:

Table 'dailyViews' 
Id - Integer, auto Increment, primary key 
views - integer 
page - varchar(150) 
datetime - datetime 

Table 'totalViews' 
Id - Integer, auto Increment, primary key 
views - integer 
page - varchar(150) 

PHP:

// Search the DB for an entry today for this page in dailyViews 
$query = "SELECT views FROM `dailyViews` WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s").""; 
$result = //insert your db connection etc to execute the query 

if (mysqli_num_rows($result)==1) { 
    $resultArray = mysqli_fetch_array($result, MYSQLI_ASSOC); 
    $views = $resultArray['views']+1; 
    $query2 = "UPDATE `dailyViews` SET `views`=".$views." WHERE `page`='".$_SERVER["SCRIPT_NAME"]."' AND `datetime`=".date("Y-M-d H:I:s").""; 
    $result2 = //insert DB connection etc. to apply update to DB 
} else if (mysqli_num_rows($result)<1) { 
    $query2 = "INSERT INTO `dailyViews` (views, page, datetime) VALUES (1, '".$_SERVER["SCRIPT_NAME"]."', ".date("Y-M-d H:I:s").")"; 
    $result2 = //insert DB connection etc. to apply update to DB 
} else { 
    // there is more than one entry for this page and date in the DB. An error has ccurred 
} 

// Then just get the total views for this page and increase it by 1. 
+0

Vì vậy, bạn đang nói có một hàng mới cho mỗi lần xem trang? Điều đó sẽ không thực sự chậm trên một trang web khổng lồ với hàng triệu lượt truy cập mỗi ngày? – Adam

+0

Nó phụ thuộc vào trang web, nhưng vô số nó là hàng triệu lượt truy cập mỗi ngày sau đó nói chung là không. Các hàng rất nhỏ về byte nên phản hồi rất nhanh. Phương pháp tôi đề xuất có thể dễ dàng mở rộng để có thêm thông tin về lượt xem trang (chẳng hạn như chia nhỏ số lượt xem thành số lượt xem theo giờ). Tôi có thể thêm một tùy chọn truy cập hàng ngày đơn giản nếu bạn thích. – Marvin

4

Thông thường những gì bạn làm trong những trường hợp này là có bảng ghi nhật ký với 1 bản ghi cho mỗi lượt xem. Bạn có một cron chạy trong khoảng thời gian nhất định (hàng ngày) để tóm tắt dữ liệu đăng nhập vào một bảng tóm tắt khác. Ở cấp độ cơ bản nhất, bạn sẽ có 1 bản ghi mỗi ngày trong bảng tóm tắt với tổng số lượt xem. Vì dữ liệu lịch sử không bao giờ thay đổi, bạn không cần cập nhật. Điều đó mang lại cho bạn tối đa 365 bản ghi cho mỗi mục mỗi năm. Không có nhiều hồ sơ, vì vậy nó vảy tốt.

Quy mô này tốt hơn so với việc có một bản ghi duy nhất cho mỗi ngày và cập nhật số lượng. Bạn có thể chạy vào các vấn đề tranh chấp/khóa nếu bạn đang cố cập nhật cùng một bản ghi nhiều lần. Bằng cách thực hiện một INSERT DELAYED và sử dụng một bảng MyISAM, bảng ghi nhật ký của bạn có thể mở rộng rất tốt.

Sau đó, bạn có thể chọn từ bảng tóm tắt để nhận số lượng hàng ngày và bạn có thể chọn từ bảng ghi nhật ký nếu bạn muốn hiển thị số ngày hiện tại.

Nếu bạn muốn giữ bảng ghi nhật ký nhỏ, khi cron của bạn chạy, bạn có thể đổi tên bảng ghi nhật ký và tạo một bảng mới, trống. Sau đó, xử lý bảng ghi nhật ký được đổi tên.

RENAME TABLE logging TO logging_old;CREATE TABLE logging LIKE logging_old; 

Nếu bạn thực sự cần phải mở rộng, bạn có thể sử dụng mẹo nhân bản để xem nhật ký cực nhanh. Bạn sử dụng một loại bảng BLACK HOLE cho dữ liệu ghi nhật ký, sao chép vào một máy chủ khác, nơi bảng là MyISAM hoặc InnoDB.