Đây có phải là giải pháp cho Caches vs Cookies sẽ khiến tôi gặp rắc rối?


23

Tôi đã đưa ra một giải pháp tạm thời cho một vấn đề không chính xác phổ biến, nhưng khác xa với vấn đề chưa từng có với sự tương tác của các giải pháp bộ nhớ đệm WP phổ biến với cookie, trong trường hợp này là cookie nhận xét WP tiêu chuẩn. Giải pháp của tôi cũng dựa trên ngoại lệ "người dùng đã biết" hiếm khi được xác định rõ ràng để phục vụ các tệp được lưu trong bộ nhớ cache. Cho dù nó có thể sử dụng được hay không, tôi cho rằng việc giải thích nó và có thể tìm hiểu lý do tại sao đó là một ý tưởng tồi có thể mang tính hướng dẫn.

Tôi đã thử nghiệm phương pháp của mình với WP Super Cache, W3 Total Cache và Comet Cache. Người mà tôi đã tự mình phân tích chi tiết khi nghiên cứu vấn đề này là WP Super Cache ("WPSC" sau đây), vì vậy tôi sẽ sử dụng nó làm ví dụ chính của mình.

LÝ LỊCH

Khi một luồng nhận xét tiêu chuẩn WP được đặt để cho phép khách truy cập nhận xét, cookie nhận xét được đặt cho bất kỳ người bình luận nào không phải là người dùng đã đăng ký và đăng nhập, với các đặc quyền nhận xét thực tế phải chịu kiểm tra thêm. Trong những gì tôi tin là cấu hình phổ biến nhất, một người bình luận chỉ cần cung cấp tên và địa chỉ email. Chúng được lưu trữ trong hai cookie trình duyệt, thường comment_author_ . COOKIEHASHcomment_author_email_ . COOKIEHASH. COOKIEHASHđược xác định theo tùy chọn người dùng.

Nếu được đặt để phân phối các tệp mới được tạo cho "người dùng đã biết", WPSC sẽ xác định xem có phục vụ tệp được lưu trong bộ nhớ cache hay không dựa trên một số kiểm tra: Người dùng đã đăng nhập nhận tệp mới và khách truy cập "có thể nhận xét". Cái sau được xác định chủ yếu bởi sự hiện diện trong trình duyệt comment_author_cookie của chúng không được xác định cụ thể hoặc duy nhất cho người dùng cụ thể bởi COOKIEHASH(thường nhưng không phải luôn luôn là phiên bản được mã hóa MD5 của "siteurl" được ghi trong tùy chọn trang web).

Cái dường như là phần chính của mã WPSC, từ wp-cache-phase1.php LL371-383, sử dụng mẫu RegEx để lấy chuỗi, đạp xe qua cookie:

$regex = "/^wp-postpass|^comment_author_";
if ( defined( 'LOGGED_IN_COOKIE' ) )
    $regex .= "|^" . preg_quote( constant( 'LOGGED_IN_COOKIE' ) );
else
    $regex .= "|^wordpress_logged_in_";
$regex .= "/";
while ($key = key($_COOKIE)) {
    if ( preg_match( $regex, $key ) ) {
        wp_cache_debug( "wp_cache_get_cookies_values: $regex Cookie detected: $key", 5 );
        $string .= $_COOKIE[ $key ] . ",";
    }
    next($_COOKIE);
}

Bây giờ, nếu tôi đang làm việc nghiêm túc với PHP, tôi có thể tái sản xuất hoặc nối vào các chức năng cốt lõi của WP và lấy mẫu bình thường comment_author_ . COOKIEHASHtheo mẫu nhận xét, nhưng tôi đang làm việc trong jQuery bằng trình cắm jQuery Cookie. Tuy nhiên, như bạn có thể thấy nếu bạn xem RegEx, chức năng WPSC không quan tâm đến COOKIEHASH: Thật hài lòng nếu nó gặp phải comment_author_.

GIẢI PHÁP TENTENT CỦA TÔI

$.cookie( 'comment_author_proxyhash', 'proxy_author', { path: '/' } );

Đối với những người không quen thuộc với Cookie jQuery: Phần trên đặt cookie phiên đơn giản với key = comment_author_proxyhashvà value = proxy_author, tốt cho toàn bộ trang web. (Ngoài ra, đối với những người sử dụng jQuery Cookie và WP, ngoài việc thay thế trước jQuery quen thuộc $cho WP jQuery, tôi cũng đã thiết lập $.cookie.raw = true;.)

Tôi đã thêm dòng vào tập lệnh jQuery của mình và, thì đấy! , WPSC, W3 Total Cache và Comet Cache đều hoạt động như tôi muốn. Sau khi tôi sử dụng tập lệnh và tải lại, tôi nhận được các trang mới. Nếu tôi tình cờ đặt một bình luận thực sự, bình thường comment_author_comment_author_email_cookie được đặt và dường như không có vấn đề gì với sự tồn tại.

Có lẽ một khuyết điểm là cookie "proxyhash" sẽ di chuyển với người dùng miễn là họ giữ phiên mở, nhưng điều đó không gây ra cho tôi khả năng là một vấn đề lớn - hoặc thậm chí đáng để cảnh báo. Tôi chắc chắn chưa bao giờ nghe ai đó phàn nàn về điều đó xảy ra với một trong những cookie thông thường.

Nhưng có lẽ có điều gì đó tôi đang thiếu, và sắp phát hiện ra nhiều điều cho sự đau khổ của tôi, nếu có khả năng cũng phù hợp với tôi. Hoặc có thể có một cách thực hành tốt nhất tương đối đơn giản để tôi sao chép COOKIEHASHtrong jQuery, cũng bao gồm các trường hợp sử dụng thay thế ... hoặc để đạt được hiệu quả cuối cùng bằng các cách khác - các cách khác để lừa các trình cắm thêm bộ đệm vào xử lý khách truy cập như một bình luận viên ...

Nếu không, có lý do chính đáng nào KHÔNG để đẩy thứ này hoặc thứ gì đó gần với nó ra vũ trụ trong một trình cắm thêm không?


3
Đạo cụ cho một câu hỏi được nghiên cứu và tài liệu tốt. Tuy nhiên, tôi cảm thấy bản chất của câu hỏi có thể mở ra điều này cho nhiều cuộc thảo luận trái ngược với câu trả lời dứt khoát (ngoài chủ đề: chủ yếu dựa trên ý kiến). Theo ý kiến ​​của tôi, tôi thấy không có gì sai ở đây - cuối cùng bạn chỉ đang đặt một cookie chung, không có dữ liệu cá nhân.
TheDeadMedic

Cảm ơn rất nhiều cho đầu vào. Tôi rất biết ơn về một cuộc thảo luận như vậy và tôi đánh dấu là câu trả lời tốt cho bất kỳ điều gì a) đã chỉ ra một vấn đề với phương pháp "cookie chung" này, b) cung cấp các phương tiện thay thế để đạt được hiệu quả tương tự, hoặc c) cung cấp hữu ích cái nhìn sâu sắc về các câu hỏi kỹ thuật cơ bản liên quan đến "người dùng đã biết".
CK MacLeod

Chỉ cần lưu ý, bạn có thể sử dụng wp_localize_scriptđể chuyển băm cookie cho Javascript của mình để bạn có thể sử dụng cookie "gốc" thay vì proxyhash. Mặt khác, đây là một vấn đề rất thú vị và giải pháp của bạn có vẻ chắc chắn, mặc dù cookie + bộ đệm luôn phức tạp đến mức khó có thể nói đó là giải pháp "đúng" hay nếu có gì đó bị bỏ sót. Nghiên cứu tuyệt vời!
phatskat

Câu hỏi thú vị - Tôi không thể nghĩ bất cứ điều gì về điều này sẽ khiến bạn gặp rắc rối, nhưng tôi có thể hỏi tại sao bạn muốn bỏ qua bộ đệm theo cách này không? Cung cấp cho người dùng loại khả năng này đánh bại mục đích có bộ đệm toàn bộ trang để bắt đầu. Hơn nữa, một cookie bổ sung thêm vào kích thước yêu cầu (mặc dù tối thiểu), khi có thể đạt được kết quả tương tự với các cấu hình bộ đệm chung bằng cách thêm bất kỳ tham số truy vấn nào vào URL, ví dụ: mysite.com?a. Chỉ 0,02 đô la của tôi ...
ssnepenthe

ssnepenthe: Có lẽ tôi nên giải thích: Một plugin tôi đang phát triển khi tôi viết câu hỏi - wordpress.org/plugins/commenter-ignore-button - sử dụng jQuery để cho phép khách truy cập đưa các bình luận viên được chọn "bỏ qua." Hành động ban đầu áp dụng định dạng CSS cho luồng nhận xét, sau đó dựa vào cookie để lưu trữ chỉ định và sự hiện diện của nó để nhân đôi hiệu ứng (thông qua PHP) qua các lần làm mới tiếp theo cho đến khi hết hạn cookie. Trong phiên bản được lưu trong bộ nhớ cache của trang, hiệu ứng sẽ không được đăng ký. Vì vậy, vâng, đó là một hình thức phá hoại bộ nhớ cache cục bộ có chủ ý.
CK MacLeod

Câu trả lời:


1

Giải pháp của bạn với cookie comment_ mượt_proxyhash tất nhiên sẽ hoạt động về mặt kỹ thuật - tất cả các plugin lưu vào bộ nhớ cache mà tôi biết không phân tích giá trị băm và sẽ chỉ dừng phân phối nội dung được lưu trong bộ nhớ cache dựa trên bình luận cookie của bình luận viên.

Vấn đề ở đây là chức năng bộ đệm trang là thứ mà các trang web thực sự cần và thường bộ nhớ đệm trang được cấu hình chính xác vì hiệu suất WordPress trần trụi là không đủ và thậm chí có thể làm sập máy chủ vào thời gian cao điểm. Nó phụ thuộc vào bản chất nội dung trang web, nhưng đôi khi chủ sở hữu trang web không thể trả tiền cho phần cứng cần thiết để xử lý mọi thứ thông qua mã PHP / WP. Nói cách khác, lưu lượng truy cập càng nhiều càng tốt phải được phục vụ từ bộ đệm trang bất cứ khi nào có thể. Từ thực tế tôi có thể nói rằng chúng ta thường phải xác định và vô hiệu hóa các plugin thực hiện ngoại lệ bộ đệm.

Tất nhiên không phải lúc nào cũng có thể, nhưng hãy cố gắng làm việc với trang được lưu trong bộ nhớ cache bất cứ khi nào có thể. Ví dụ: bạn có thể ẩn divcác thẻ với các bình luận bạn muốn bỏ qua thông qua javascript hoặc toàn bộ khối bình luận ajax-ify.

Trong mọi trường hợp, bạn không cần đánh dấu khách truy cập là người bình luận, nhưng hãy dừng bộ đệm vì lý do logic tùy chỉnh của bạn. Vì vậy, tốt hơn là sử dụng cookie duy nhất và biến nó thành tín hiệu ngoại lệ bộ đệm. W3 Total Cache có tùy chọn "Từ chối cookie" cho điều đó, nhưng không phải các plugin khác trong danh sách của bạn, do đó bạn sẽ cần một bản hack giống như bạn đã đề xuất.


Cảm ơn! Bạn nêu ra một số vấn đề hợp lệ, nhưng tôi sẽ nói rằng về cơ bản, mã này làm gì đối xử với bất kỳ khách truy cập nào đang tham gia chuỗi nhận xét đủ để đưa ai đó "bỏ qua" hoặc "tắt tiếng" như một "người dùng đã biết / bình luận." Nếu một trang web không thể xử lý sự tham gia đó, thì có lẽ nó cũng không thể xử lý một mẫu nhận xét WordPress tiêu chuẩn (và cộng đồng bình luận)!
CK MacLeod

Hãy nghĩ rằng bạn đang ở đây, trong khi tất nhiên không thể biết chắc chắn người dùng của bạn sử dụng nó như thế nào. Btw nhiều trang web lưu lượng truy cập cao giảm tải xử lý bình luận của họ cho một yêu cầu riêng biệt hoặc thậm chí dịch vụ của bên thứ ba chính xác cho mục đích hiển thị nội dung bài viết nhanh và lười tải nội dung bình luận động sau này. Hãy coi đó là một ý tưởng không chính thức cho các phiên bản plugin khác của bạn :)
WowPress.host
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.