ที่เก็บข้อมูลเซสชันที่เชื่อถือได้มากที่สุดใน PHP: Memcache, ฐานข้อมูลหรือไฟล์คืออะไร? [ปิด]


10

เป็นวิธีที่ดีที่สุดและปลอดภัยที่สุดในการจัดการเซสชัน PHP คืออะไร เป็นวิธีที่ดีที่สุดในการจัดเก็บเซสชันใน:

  1. ฐานข้อมูล (น่าเชื่อถือมากขึ้น แต่มีคอขวดสูงความเร็วช้าไม่ดีสำหรับเว็บไซต์ที่มีการใช้ฐานข้อมูลสูง)?

  2. Memcache (เร็วสุด ๆ แต่กระจายปัญหาความปลอดภัยมากขึ้นโอกาสที่จะสูญเสียข้อมูลเมื่อรีสตาร์ทเซิร์ฟเวอร์และมีโอกาสสูญเสียข้อมูลเมื่อแคชเต็ม)?

  3. ไฟล์ (ตัวเลือกเริ่มต้นฉันเดาว่าช้าเพราะอ่านและเขียนจากไฟล์ I / O ความปลอดภัยน้อยลง ฯลฯ )

วิธีใดดีที่สุด อะไรคือปัญหาและสิ่งที่ดีในแต่ละแนวทาง


2
ฉันเชื่อว่าคุณควรระบุว่าคุณใช้เครื่องเพียงเครื่องเดียวหรือหากมีการเผยแพร่แอปพลิเคชันเนื่องจากจะมีผลอย่างมากต่อคำตอบ
Arseni Mourzenko

1
@haylem นี้เป็นสถานที่ที่เหมาะสมที่สุดในการถามคำถามนี้ไม่ใช่คำถามการเขียนโปรแกรมปัญหาเกี่ยวกับแนวคิดการเขียนโปรแกรม
#: 11117459 ผู้ใช้

3
นี่เป็นคำถามที่แย่มากเพราะ 'ดีที่สุด' ขึ้นอยู่กับสถานการณ์เฉพาะของคุณ 'ดีที่สุด' สำหรับ Facebook อาจไม่เหมือน 'ดีที่สุด' สำหรับหน้าแรกส่วนตัวของคุณ
GrandmasterB

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

คำตอบ:


6

วิธีที่ดีที่สุดคือการจัดเก็บที่ Memcached เนื่องจากเราสามารถแก้ไขปัญหาอื่น ๆ ได้อย่างง่ายดาย (ขนาดแคชความปลอดภัย ฯลฯ )

facebookเป็นผู้บริโภคอันดับ 1 ในกลุ่ม memcached โปรดอ่านหากสนใจ: http://www.facebook.com/note.php?note_id=39391378919

วิธีแก้ปัญหาอื่น ๆ


4

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

ระบบไฟล์ - ฉันไม่เคยเห็นจำเป็นต้องทำเช่นนั้น ฉันชอบความเรียบง่ายของการจัดการแถวในตารางมากกว่าไฟล์เล็ก ๆ น้อย ๆ รวมทั้งคุณไม่สามารถค้นหาข้ามไฟล์หากคุณต้องการขุดลงในสถิติเซสชัน

โปรดทราบว่าด้วย PHP มันเป็นเรื่องง่ายที่จะสลับจากตัวจัดการเซสชัน ดังนั้นคุณสามารถเริ่มต้นด้วยรูปแบบการจัดเก็บหนึ่งและย้ายไปที่อื่นโดยไม่ต้องยุ่งยากมากเกินไป


4

สิ่งที่เกี่ยวกับการใช้เครื่องมือจัดเก็บ MEMORY ใน MySQL?

มันไม่เร็วเท่า Memcache แต่มีข้อดีที่คุณสามารถใช้ SQL ธรรมดาและคุณยังสามารถใช้เอนจินการเก็บข้อมูลปกติเมื่อมันไม่จำเป็นและเปลี่ยนเป็น MEMORY เมื่อจำนวนผู้ใช้ / คำขอเพิ่มขึ้น

ฉันใช้มันเพื่อจัดเก็บข้อมูลสถิติจำนวนมากในแอปพลิเคชันเว็บซึ่งมีการเปลี่ยนแปลงบ่อยดังนั้นจึงไม่ได้ใช้สำหรับจัดการเซสชัน แต่ฉันคิดว่ามันควรจะเหมาะสำหรับวัตถุประสงค์นี้


3

โพสต์บล็อกนี้แสดงผลลัพธ์ของการเปรียบเทียบประสิทธิภาพของเอนจิ้นการจัดเก็บเซสชันต่างๆกับ Magento และพวกเขาสรุปว่าผู้ใช้งานพร้อมกันประมาณ 75 คนมีประสิทธิภาพที่แตกต่างกันไม่ได้

ฉันคิดว่าในระดับเหล่านี้ (พวกเขามีธุรกรรมประมาณ 5 ครั้งต่อวินาทีซึ่งจะอยู่ที่ 430k ครั้งในช่วง 12 ชั่วโมง) ค่าโสหุ้ยในทุกสิ่งจะมีผลต่อประสิทธิภาพการทำงานที่คุณเห็นตั้งแต่ไฟล์ / DB / Memcache / Redis การจราจรโดยไม่ทำลายเหงื่อถ้าใช้อย่างถูกต้อง

นั่นทำให้ปัจจัยอื่น ๆ เช่นความยืดหยุ่นความน่าเชื่อถือและความปลอดภัย

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

Memcache ค่อนข้างเร็วและหากคุณกำลังพิจารณาโซลูชันระดับ Memcache ในวงกว้างมากขึ้น (Redis และอื่น ๆ ) มีบางอย่างที่จะให้คำมั่นว่าจะคงอยู่ในหน่วยความจำเพื่ออ่านความเร็วเพื่อให้คุณได้รับประโยชน์สูงสุดจากทั้งสองโลก มันค่อนข้างง่ายที่จะให้เหตุผลและลักษณะสำคัญของการประชุมคือสิ่งที่สิ่งเหล่านี้ได้รับการออกแบบมาให้ทำ คุณรู้หรือไม่ว่าคุณจะต้องใส่เข้าไปในเซสชั่นเพื่อเติมหนึ่งในสิ่งเหล่านี้? ตัวเลือกทั้งหมดของคุณจะบังคับให้คุณประนีประนอมหากคุณมีความสามารถเพียงพอ ดิสก์เต็มไปด้วยไฟล์ (จำนวนและขนาดแฟคเตอร์ในที่นี้) ที่เก็บแคชเต็มความจุและฐานข้อมูลมีจำนวนแถวที่ จำกัด และจำกัดความจุของดิสก์เท่ากับแนวทางของไฟล์ นอกจากนี้ระบบเหล่านี้จะมีการเผยแพร่ก็ต่อเมื่อคุณเรียกใช้ระบบเหล่านั้นในลักษณะกระจาย ส่วนใหญ่ทำงานได้ดีกับการตั้งค่าเซิร์ฟเวอร์เดียว หากคุณแจกจ่ายให้คุณอาจมีเว็บเซิร์ฟเวอร์ / เซิร์ฟเวอร์ฐานข้อมูลอื่น ๆ อยู่แล้วดังนั้นปัญหาระบบกระจายของคุณจะไม่ปรากฏขึ้นจากตัวเลือกที่เก็บข้อมูลเซสชันของคุณ อย่างไรก็ตามเมื่อคุณต้องการปริมาณการใช้งาน / กำลังการผลิต 10 เท่าการไปถึงที่นั่นจะเป็นเรื่องที่เป็นธรรมชาติมากกว่าการเก็บไฟล์ ที่เก็บคีย์ / ค่าบางแห่งจะช่วยให้คุณสามารถทำการวิเคราะห์ข้อมูลเซสชันได้ง่าย ๆ แต่ส่วนใหญ่จะไม่ให้คุณเข้าใกล้สิ่งที่ SQL สามารถทำได้

ฉันไม่แน่ใจว่าทำไมคุณเสนอว่าฐานข้อมูลอาจเชื่อถือได้มากกว่าตัวเลือกอื่น ๆ แต่ฉันได้รับความสนใจจากฐานข้อมูลเนื่องจากแอปพลิเคชัน PHP ของคุณอาจใช้งานได้แล้ว ซึ่งหมายความว่าคุณไม่ได้เพิ่มการพึ่งพาเซิร์ฟเวอร์อื่นและคุณสามารถใช้การเชื่อมต่อเดียวกันกับที่คุณใช้เพื่อดึงข้อมูลเซสชันเพื่อรับข้อมูลผู้ใช้ดังนั้นคุณไม่จำเป็นต้องสร้างหนึ่งสำหรับข้อมูลหนึ่งสำหรับ Memcache ฯลฯ หากคุณจัดทำดัชนี ตารางดีมันจะทำงานได้อย่างรวดเร็วพอสมควรและให้ความหมายง่ายๆที่คุณคุ้นเคยอยู่แล้วสำหรับการสร้างเซสชันเก่าหรือแม้แต่การวิเคราะห์ข้อมูลเซสชัน (ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการและถ้าคุณไม่ได้เป็นเช่นนี้อาจไม่ได้ ' มีความสำคัญมาก) การขยายไปยังเครื่องชั่งขนาดใหญ่นั้นไม่สำคัญเท่ากับ Redis

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


0

ขึ้นอยู่กับความต้องการของคุณ

มีความแตกต่างระหว่างไฟล์และที่เก็บฐานข้อมูล ดูคำถามนี้

อย่างไรก็ตามคุณสามารถทำสิ่งที่ทำใน Rails 3 โดยค่าเริ่มต้นและใช้เฉพาะคุกกี้ที่เข้ารหัสสำหรับเซสชันของคุณ ดังนั้นคุณเข้ารหัสค่าทั้งหมดในแบบที่มีเพียงคุณเท่านั้นที่สามารถถอดรหัสได้ในภายหลัง (เช่นคีย์ส่วนตัว / สาธารณะ) และคุณปล่อยให้ไคลเอนต์ทำการรักษาสถานะให้คุณ

ในมือข้างหนึ่งมัน จำกัด คุณไว้ที่ 4Kb ซึ่งโดยปกติแล้วจะเพียงพอ (เนื่องจากคุณมักจะต้องการเก็บ ID ไม่ใช่วัตถุทั้งหมด) แต่ประโยชน์ที่ดีจริงๆที่คุณได้รับคือคุณไม่ต้องกังวลเกี่ยวกับการล้างข้อมูลในเซสชัน คุณปล่อยให้มันขึ้นอยู่กับลูกค้าที่มันควรจะเป็นจริง


2
หากคุณไม่ได้แยกทรัพยากรคงที่ของคุณออกไปนอกเส้นทางคุกกี้คุกกี้เป็นภาษีคงที่ที่คุณต้องจ่ายในทุกคำขอ
Joeri Sebrechts

jQuery และ Bootstrap รวมกันประมาณ 150kb และไม่มีไลบรารีอื่น คุกกี้สูงสุดคือ 4kb และโดยปกติจะต่ำกว่า 1Kb นอกเสียจากว่า OP จะถามเกี่ยวกับสถานการณ์ที่รุนแรงใครจะเป็นคนเก็บภาษีแบบนั้น?
Yam Marcovic

@YamMarcovic มีปัญหาเล็กน้อย 1) คุกกี้กำลังไปที่เซิร์ฟเวอร์ด้วย (ผู้ใช้มักจะดาวน์โหลดได้เร็วขึ้นแล้วอัปโหลด) 2) หน้าเว็บมักจะมี 100 คำร้องขอสำหรับไฟล์แบบคงที่ (รูปภาพ, js, css) เพื่อให้สามารถรับได้ 100kb ในแต่ละคำขอ กำลังจะขึ้น
Miro Svrtan

@MiroSvrtan หากคุณทำให้ผู้ใช้ของคุณส่งคำขอหลายร้อยรายการต่อหน้า (ที่เคยเกิดขึ้นมาก่อน) การเพิ่มประสิทธิภาพไม่ชัดเจนว่าเป็นปัญหาสำหรับคุณ
Yam Marcovic

ฉันมีไคลเอนต์ที่ไซต์กำลังร้องขอ ~ 170 HTTP ให้โหลดหน้าแรกก่อนที่จะปรึกษาฉันเพื่อการเพิ่มประสิทธิภาพความเร็วดังนั้นจึงเกิดขึ้นเชื่อใจฉัน Btw, คีย์ส่วนตัว / สาธารณะเป็นแนวคิดจากการเข้ารหัสแบบอสมมาตรซึ่งโดยทั่วไปจะไม่ถูกนำไปใช้ในสถานการณ์นี้ซึ่งเทียบเท่ากับการเข้ารหัสแบบสมมาตรซึ่งมีความซับซ้อนมากขึ้นในการติดตั้งเท่านั้น นอกจากนี้การใช้พื้นที่เก็บข้อมูลเซสชันส่วนใหญ่อาศัยคุกกี้ที่จัดการโดยลูกค้าดังนั้นประโยชน์ที่อธิบายไว้ในวรรคสุดท้ายของคำตอบจะมีผลกับทุกคน
jeteon

0

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

memcache ฟังดูน่าสนใจ แต่เรามีกระบวนการมากเกินไปที่จะล้าง memcache ทั้งหมดดังนั้นเซสชันผู้ใช้จะถูกตัดออกบ่อยเกินไป และเซสชันที่เก่ากว่าจะถูกล้างเมื่อหน่วยความจำเต็ม ... จึงไม่มีการเข้าสู่ระบบถาวรอีกต่อไป

เราจะลองเซสชันที่อิงกับไฟล์เริ่มต้นในไม่ช้า

หากคุณกังวลเกี่ยวกับความปลอดภัยของข้อมูลเซสชั่นของคุณคุณไม่ควรใส่ข้อมูลนั้นในเซสชั่นและไม่เชื่อถือเซสชั่นตรวจสอบผู้ใช้ในทุกคำขอ


0

คุณสามารถพยายามที่จะบันทึกเซสชั่นของคุณบนRedis Redis เร็วเหมือน Memcached แต่ยังมีตัวเลือกการคงอยู่ของข้อมูลหลายอย่าง นอกจากนี้ยังรองรับไคลเอนต์ PHP ต่างๆ

นอกจากนี้คุณสามารถลองใช้บริการของบุคคลที่สามเช่นMemcached Cloudที่มีการจำลองแบบในตัวและความสามารถของเครื่องมือจัดเก็บข้อมูล

การเปิดเผยข้อมูลฉันเป็นผู้ร่วมก่อตั้งและ CTO ของ Garantia Data


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