วิธีนี้เป็นทางออกสำหรับแคช vs คุกกี้จะทำให้ฉันมีปัญหาหรือไม่?


23

ฉันคิดวิธีแก้ปัญหาชั่วคราวสำหรับปัญหาที่ไม่ธรรมดา แต่ก็ยังห่างไกลจากปัญหาที่ไม่เคยเกิดขึ้นมาก่อนกับการโต้ตอบของโซลูชันแคช WP ที่เป็นที่นิยมกับคุกกี้ในกรณีนี้คือคุกกี้ความคิดเห็น WP มาตรฐาน โซลูชันของฉันมีข้อยกเว้น "ผู้ใช้ที่รู้จักกันดี" ที่ไม่ค่อยได้รับการกล่าวถึงอย่างชัดเจนในการให้บริการไฟล์แคช ไม่ว่าจะใช้งานได้หรือไม่ฉันคิดว่าอธิบายและเรียนรู้ว่าทำไมมันเป็นความคิดที่ไม่ดีอาจให้คำแนะนำโดยทั่วไป

ฉันได้ทดสอบวิธีการของฉันด้วย WP Super Cache, W3 Total Cache และ Comet Cache สิ่งที่ฉันแยกแยะให้ละเอียดในตัวเองในขณะที่ศึกษาปัญหานี้คือ WP Super Cache ("WPSC" ต่อจากนี้) ดังนั้นฉันจะใช้มันเป็นตัวอย่างหลักของฉัน

พื้นหลัง

เมื่อเธรดความคิดเห็นมาตรฐาน WP ถูกตั้งค่าเพื่ออนุญาตให้ผู้เยี่ยมชมแสดงความคิดเห็นคุกกี้ความคิดเห็นจะถูกตั้งค่าสำหรับผู้แสดงความคิดเห็นที่ไม่ใช่ผู้ใช้ที่ลงทะเบียนและเข้าสู่ระบบด้วยสิทธิ์การแสดงความคิดเห็นจริงภายใต้การตรวจสอบเพิ่มเติม ในสิ่งที่ฉันเชื่อว่าเป็นการกำหนดค่าที่พบบ่อยที่สุดผู้วิจารณ์จำเป็นต้องระบุชื่อและที่อยู่อีเมลเท่านั้น เหล่านี้จะถูกเก็บไว้ภายในสองคุกกี้เบราว์เซอร์มักจะและcomment_author_ . COOKIEHASH ถูกกำหนดตามตัวเลือกผู้ใช้comment_author_email_ . COOKIEHASHCOOKIEHASH

หากตั้งค่าให้ส่งไฟล์ที่สร้างขึ้นใหม่ให้กับ "ผู้ใช้ที่รู้จัก" WPSC จะกำหนดว่าจะให้บริการไฟล์แคชหรือไม่บนพื้นฐานของการตรวจสอบหลายครั้ง: ผู้ใช้ที่ลงชื่อเข้าใช้จะได้รับไฟล์ใหม่และผู้เยี่ยมชม ส่วนหลังจะถูกระบุอย่างชัดเจนจากการมีอยู่ของเบราว์เซอร์comment_author_คุกกี้ซึ่งไม่ได้ระบุหรือไม่ซ้ำกันสำหรับผู้ใช้โดยเฉพาะCOOKIEHASH(โดยปกติ แต่ไม่เสมอไป "MDP" ที่เข้ารหัสรุ่น MD5 ที่เข้ารหัสในตัวเลือกไซต์)

สิ่งที่ดูเหมือนจะเป็นส่วนสำคัญของรหัส WPSC จาก wp-cache-phase1.php LL371-383 ใช้รูปแบบ RegEx เพื่อรับสายโดยปั่นผ่านคุกกี้:

$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);
}

ตอนนี้ถ้าฉันทำงานอย่างเคร่งครัดใน PHP ฉันสามารถสร้างใหม่หรือเชื่อมโยงไปยังฟังก์ชั่นหลักของ WP และรับcomment_author_ . COOKIEHASHชุดแม่แบบความคิดเห็นปกติ แต่ฉันทำงานใน jQuery โดยใช้ปลั๊กอิน jQuery Cookie อย่างไรก็ตามในขณะที่คุณสามารถดูว่าคุณมองไปที่ RegEx ฟังก์ชั่น WPSC ไม่สนใจเกี่ยวกับCOOKIEHASH: comment_author_มันมีความพึงพอใจถ้ามันเผชิญหน้า

แนวทางแก้ไขปัญหาของฉัน

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

สำหรับผู้ที่ไม่คุ้นเคยกับ jQuery Cookie: ด้านบนตั้งค่าคุกกี้เซสชันอย่างง่ายด้วย key = comment_author_proxyhashand value = proxy_author, เหมาะสำหรับทั้งไซต์ (นอกจากนี้สำหรับผู้ที่ใช้ jQuery Cookie และ WP นอกเหนือจากการแทนที่ jQuery ที่คุ้นเคย$สำหรับ WP jQueryเราได้ตั้งค่าไว้แล้ว$.cookie.raw = true;)

ฉันเพิ่มบรรทัดลงในสคริปต์ jQuery ของฉันและvoila! , WPSC, W3 Total Cache และ Comet Cache ทำหน้าที่เหมือนที่ฉันต้องการ หลังจากที่ฉันใช้สคริปต์และโหลดฉันได้รับหน้าใหม่ ถ้าฉันแสดงความคิดเห็นจริง ๆจะมีการตั้งค่าปกติcomment_author_และcomment_author_email_คุกกี้และดูเหมือนว่าจะไม่มีปัญหาใด ๆ กับการอยู่ร่วมกัน

อาจมีข้อบกพร่องอย่างหนึ่งคือคุกกี้ "proxyhash" จะเดินทางไปกับผู้ใช้ตราบใดที่เขาหรือเธอยังคงเปิดเซสชัน แต่นั่นไม่ได้ทำให้ฉันเป็นปัญหาใหญ่ - หรือคุ้มค่ากับการเตือน ฉันไม่เคยได้ยินใครบางคนบ่นเกี่ยวกับเรื่องแบบนี้กับคุกกี้ปกติ

แต่อาจมีบางสิ่งที่ฉันพลาดไปและกำลังจะค้นพบความทุกข์ยากมากมายของฉัน หรืออาจจะมีวิธีปฏิบัติที่ดีที่สุดที่ค่อนข้างง่ายสำหรับฉันในการทำซ้ำCOOKIEHASHใน jQuery ครอบคลุมทั้งกรณีการใช้งานทางเลือก ... หรือเพื่อให้ได้ผลสุดท้ายแบบเดียวกันด้วยวิธีการอื่น - วิธีอื่น ๆ ในการหลอกปลั๊กอินแคชเพื่อดูแลผู้เข้าชม ในฐานะผู้แสดงความคิดเห็น ...

หากไม่มีมีเหตุผลที่ดีที่จะไม่ผลักดันสิ่งนี้หรือสิ่งที่อยู่ใกล้กับเอกภพในปลั๊กอินหรือไม่?


3
อุปกรณ์ประกอบฉากสำหรับคำถามที่มีการวิจัยและมีเอกสารครบถ้วน อย่างไรก็ตามฉันรู้สึกว่าธรรมชาติของคำถามอาจเปิดให้มีการสนทนามากกว่านี้เมื่อเทียบกับคำตอบที่ชัดเจน (นอกหัวข้อ: โดยพื้นฐานความคิดเห็นเป็นหลัก) FWIW ในความคิดของฉันฉันเห็นว่าไม่มีอะไรผิดพลาดที่นี่ - ในที่สุดคุณเพียงแค่ตั้งค่าคุกกี้ทั่วไปที่ไม่มีข้อมูลส่วนบุคคล
TheDeadMedic

ขอบคุณมากสำหรับการป้อนข้อมูล ฉันขอขอบคุณสำหรับการอภิปรายดังกล่าวและฉันจะทำเครื่องหมายเป็นคำตอบที่ดีใด ๆ ที่ a) ชี้ให้เห็นปัญหาด้วยวิธีการ "คุกกี้สามัญ" นี้ b) ให้วิธีการอื่นในการบรรลุผลเดียวกันหรือ c) มีประโยชน์ ข้อมูลเชิงลึกเกี่ยวกับคำถามทางเทคนิคที่เกี่ยวข้องกับ "ผู้ใช้ที่รู้จัก"
CK MacLeod

เพื่อให้ทราบว่าคุณสามารถใช้wp_localize_scriptเพื่อส่งต่อแฮชคุกกี้ไปยัง Javascript ของคุณเพื่อให้คุณสามารถใช้คุกกี้ "เนทีฟ" แทนการใช้พรอกซี มิฉะนั้นนี่เป็นปัญหาที่น่าสนใจมากและวิธีการแก้ปัญหาของคุณดูดีแม้ว่าคุกกี้ + แคชจะซับซ้อนอยู่เสมอดังนั้นจึงยากที่จะบอกได้ว่าเป็นโซลูชันที่ "ถูกต้อง" หรือมีบางอย่างที่พลาดไป การวิจัยที่ยอดเยี่ยม!
phatskat

คำถามที่น่าสนใจ - ฉันไม่สามารถคิดอะไรเกี่ยวกับสิ่งนี้ที่จะทำให้คุณมีปัญหา แต่ฉันจะถามได้ไหมว่าทำไมคุณถึงต้องการหลีกเลี่ยงแคชด้วยวิธีนี้ การให้ความสามารถแก่ผู้ใช้ในการเอาชนะจุดประสงค์ของการมีแคชแบบเต็มหน้าเพื่อเริ่มต้น นอกจากนี้คุกกี้พิเศษจะเพิ่มขนาดคำขอ (แม้ว่าจะน้อยที่สุด) เมื่อผลลัพธ์เดียวกันสามารถทำได้ด้วยการกำหนดค่าแคชทั่วไปโดยเพียงผนวกพารามิเตอร์แบบสอบถามใด ๆ ลงใน URL เช่น mysite.com?a แค่ $ 0.02 ของฉัน ...
พฤศจิกายน

ssnepenthe: บางทีฉันควรจะอธิบายได้: ปลั๊กอินที่ฉันพัฒนาเมื่อฉันเขียนคำถาม - wordpress.org/plugins/commenter-ignore-button - ใช้ jQuery เพื่อให้ผู้เยี่ยมชมใส่ความคิดเห็นที่เลือก "ไม่สนใจ" การดำเนินการเริ่มต้นจะใช้การจัดรูปแบบ CSS กับเธรดความคิดเห็นจากนั้นอาศัยคุกกี้เพื่อจัดเก็บการกำหนดและการมีอยู่ของการทำซ้ำเอฟเฟกต์ (ผ่าน PHP) ผ่านการรีเฟรชที่ตามมาจนกระทั่งหมดอายุคุกกี้ ในหน้าแคชเวอร์ชันผลจะไม่ถูกลงทะเบียน ดังนั้นใช่มันเป็นรูปแบบของการปิดกั้นแคชโดยเจตนา
CK MacLeod

คำตอบ:


1

โซลูชันของคุณที่มี comment_author_proxyhash cookie จะใช้งานได้จริงในทางเทคนิค - ปลั๊กอินแคชทั้งหมดที่ฉันรู้ไม่ได้วิเคราะห์ค่าแฮชและจะหยุดการส่งเนื้อหาที่แคชไว้โดยอิงจาก comment_author_ * presense cookie

ปัญหาที่นี่คือฟังก์ชั่นการแคชหน้าเว็บเป็นสิ่งที่เว็บไซต์ต้องการจริงๆและบ่อยครั้งที่การแคชหน้าถูกกำหนดค่าไว้อย่างแน่นอนเพราะประสิทธิภาพการทำงานของ WordPress เปล่านั้นไม่เพียงพอและยังสามารถพังเซิร์ฟเวอร์ได้ในช่วงเวลาเร่งด่วน ขึ้นอยู่กับลักษณะเนื้อหาของเว็บไซต์ แต่บางครั้งเจ้าของเว็บไซต์ไม่สามารถชำระค่าฮาร์ดแวร์ที่จำเป็นในการจัดการทุกอย่างผ่านโค้ด PHP / WP กล่าวอีกนัยหนึ่งให้มากที่สุดเท่าที่จะทำได้ทราฟฟิกหน้าแคชเมื่อทำได้ จากการปฏิบัติฉันอาจบอกได้ว่าเรามักจะต้องระบุและปิดการใช้งานปลั๊กอินที่ทำข้อยกเว้นแคช

แน่นอนว่ามันเป็นไปไม่ได้เสมอไป แต่พยายามทำงานกับหน้าแคชทุกครั้งที่ทำได้ ตัวอย่างเช่นคุณอาจซ่อนdivแท็กที่มีความคิดเห็นที่คุณต้องการละเว้นผ่าน javascript หรือบล็อกความคิดเห็นทั้งหมด ajax-ify

ไม่ว่าในกรณีใดคุณไม่จำเป็นต้องทำเครื่องหมายผู้เข้าชมเป็นผู้วิจารณ์ แต่หยุดการแคชเนื่องจากเหตุผลเชิงตรรกะที่กำหนดเองของคุณ ดังนั้นจึงเป็นการดีกว่าที่จะใช้คุกกี้ที่ไม่ซ้ำกันและทำให้มันเป็นสัญญาณการยกเว้นแคช W3 Total Cache มีตัวเลือก "ปฏิเสธคุกกี้" สำหรับสิ่งนั้น แต่ไม่ใช่ปลั๊กอินอื่น ๆ จากรายการของคุณดังนั้นคุณต้องแฮ็คอย่างที่คุณแนะนำ


ขอบคุณ! คุณยกประเด็นที่ถูกต้องขึ้นมาหลายฉบับ แต่ฉันจะบอกว่าสิ่งที่รหัสนี้ทำคือการปฏิบัติต่อผู้เข้าชมที่เข้าร่วมในกระทู้ความคิดเห็นมากพอที่จะทำให้ใครบางคน "ไม่สนใจ" หรือ "ปิดเสียง" เป็น "ผู้ใช้ที่รู้จัก / แสดงความคิดเห็น." หากไซต์ไม่สามารถจัดการการมีส่วนร่วมได้ก็อาจไม่สามารถจัดการเทมเพลตความคิดเห็น WordPress มาตรฐาน (และคอมเม้นท์คอมมิวนิตี้) ได้เช่นกัน!
CK MacLeod

คิดว่าคุณอยู่ที่นี่ในขณะที่แน่นอนไม่ทราบว่าผู้ใช้ของคุณใช้มันอย่างไร เว็บไซต์ที่มีอัตราการเข้าชมสูงจำนวนมากนั้นทำการประมวลผลความคิดเห็นของพวกเขาไปยังคำขอที่แยกต่างหากหรือแม้แต่บริการของบุคคลที่สามเพื่อวัตถุประสงค์ในการแสดงเนื้อหาบทความอย่างรวดเร็วและขี้เกียจโหลดเนื้อหาความคิดเห็นแบบไดนามิกในภายหลัง ลองคิดดูว่าปลั๊กอินของคุณอาจจะเป็นเวอร์ชั่นต่อไป :)
WowPress.host
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.