การผูกมัด Singleton ใน Laravel อาจนำไปสู่การรั่วไหลของหน่วยความจำโดยเฉพาะอย่างยิ่งในกระบวนการที่ดำเนินมายาวนานหากไม่ได้รับการจัดการอย่างระมัดระวัง ปัญหานี้ส่วนใหญ่เกิดขึ้นเนื่องจาก Singletons ยังคงมีอยู่ตลอดอายุการใช้งานของแอปพลิเคชันหรือกระบวนการโดยยึดวัตถุอินสแตนซ์ของพวกเขาไว้ในหน่วยความจำ ซึ่งแตกต่างจากสคริปต์ PHP ทั่วไปที่จัดการคำขอ HTTP ซึ่งมีอายุสั้นและรีเซ็ตหน่วยความจำในแต่ละคำขอกระบวนการ laravel ที่มีอายุยาวนานเช่นที่ทำงานภายใต้ออกเทนพนักงานคิวหรือกระบวนการ daemon จะจัดสรรหน่วยความจำจนกว่ากระบวนการจะสิ้นสุดหรือเริ่มต้นใหม่
ใน Laravel มีการผูกมัดแบบซิงเกิลสองประเภท: ซิงเกิลแบบดั้งเดิมและซิงเกิลที่มีขอบเขต ซิงเกิลปกติที่ถูกผูกไว้โดยใช้วิธี `singleton ()` ยังคงมีอินสแตนซ์เดียวกันตลอดวงจรชีวิตทั้งหมดของแอปพลิเคชันในกระบวนการที่กำหนด ซึ่งหมายความว่าหากแอปพลิเคชันทำงานเป็น daemon ที่มีอายุยืนยาว (เช่น Octane Worker) อินสแตนซ์เดี่ยวยังคงอยู่ในหน่วยความจำอย่างไม่มีกำหนด ในทางตรงกันข้าม Singletons ที่มีขอบเขตซึ่งผูกพันกับวิธี `Scoped ()` จะถูกรีเซ็ตในตอนท้ายของการร้องของานหรือวงจรชีวิตในกระบวนการที่ดำเนินการมานานช่วยป้องกันการรั่วไหลของหน่วยความจำโดยอนุญาตให้วัตถุออกอย่างถูกต้องหลังจากทุกรอบการร้องขอ
การรั่วไหลของหน่วยความจำเกิดขึ้นเมื่อ Singletons เก็บวัตถุขนาดใหญ่หรือซับซ้อนหรือวัตถุที่ตัวเองอ้างอิงถึงผู้อื่นป้องกันไม่ให้นักสะสมขยะของ PHP ไม่ให้ปลดปล่อยหน่วยความจำนั้น การอ้างอิงแบบวงกลมระหว่างวัตถุ (ที่มีการอ้างอิงวัตถุสองชิ้นขึ้นไป) สามารถทำให้ปัญหานี้รุนแรงขึ้นทำให้หน่วยความจำถูกเก็บไว้โดยไม่ได้ตั้งใจ ตัวอย่างเช่นการจัดเก็บแบบจำลองที่มีคารมคมคายหรือคลาสบริการที่มีข้อมูลซ้อนหรือเกี่ยวข้องภายในซิงเกิลโดยไม่ต้องล้างข้อมูลอ้างอิงเหล่านั้นอาจทำให้เกิดการรั่วไหลเหล่านี้
ในคนงานคิวหรือคำสั่งที่ใช้งานยาวนานอื่น ๆ CLI ซึ่งการใช้หน่วยความจำมีความสำคัญการรั่วไหลของหน่วยความจำจากซิงเกิลหรือคุณสมบัติคงที่สะสมเมื่อเวลาผ่านไป สิ่งนี้เกิดขึ้นเนื่องจากกระบวนการไม่ได้รีเซ็ตหน่วยความจำระหว่างงาน นักพัฒนาจะต้องชัดเจนหรือไม่เปิดเผยอินสแตนซ์ซิงเกิลเหล่านี้อย่างชัดเจนหรือข้อมูลที่พวกเขาเก็บไว้หรือใช้ตัวเลือกผู้ปฏิบัติงานที่รีสตาร์ทกระบวนการโดยอัตโนมัติหลังจากขีด จำกัด หน่วยความจำหรือจำนวนงานที่แน่นอนลดผลกระทบการรั่วไหล
แนวทางปฏิบัติเชิงป้องกันรวมถึงการหลีกเลี่ยงการจัดเก็บชุดข้อมูลหรือแบบจำลองขนาดใหญ่ภายในบริบทคงที่หรือซิงเกิลตันโดยไม่ต้องล้างอย่างเหมาะสมโดยใช้แคชหรือฐานข้อมูลของ Laravel สำหรับข้อมูลถาวรแทนการทำลายการอ้างอิงแบบวงกลมด้วยตนเองเมื่อจำเป็นและใช้ singletons ที่มีขอบเขต นอกจากนี้การโทรของ PHP `GC_COLLECT_CYCLES ()` ในลูปสามารถช่วยบังคับคอลเลกชันขยะในกรณีที่มีการอ้างอิงแบบวงกลม
พฤติกรรมดั้งเดิมของ Laravel สำหรับ Singletons ในแอปพลิเคชัน HTTP แบบดั้งเดิมนั้นมีแนวโน้มที่จะเกิดการรั่วไหลของหน่วยความจำน้อยลงเนื่องจากอินสแตนซ์แอปพลิเคชันทั้งหมดและหน่วยความจำได้รับการล้างหลังจากคำขอทุกครั้ง อย่างไรก็ตามเมื่อย้ายไปยังกระบวนการที่ใช้เวลานานเช่นออกเทนหรือคนงานการใช้งาน Singleton สามารถนำไปสู่การรั่วไหลของหน่วยความจำหากซิงเกิลหรือวัตถุที่เก็บไว้จะไม่ถูกล้างอย่างเหมาะสมในระหว่างวงจรชีวิต
โดยสรุปแล้วการผูก Singleton ใน Laravel สามารถทำให้หน่วยความจำรั่วไหลเป็นหลักในสภาพแวดล้อมรันไทม์ที่มีอายุยืนยาวหรือต่อเนื่องหากวัตถุไม่ถูกปล่อยออกมาอย่างถูกต้อง Singletons ที่มีการกำหนดขอบเขตเป็นทางเลือกที่ปลอดภัยกว่าในบริบทเหล่านั้นโดยการรีเซ็ตอินสแตนซ์ระหว่างคำขอหรืองาน การออกแบบที่เหมาะสมเพื่อหลีกเลี่ยงการอ้างอิงแบบวงกลมและการล้างข้อมูลการอ้างอิงวัตถุที่หนักหรือซ้อนกันอย่างชัดเจนในซิงเกิลเป็นสิ่งจำเป็นเพื่อป้องกันการสะสมของหน่วยความจำและการรั่วไหลในแอปพลิเคชัน Laravel
คำอธิบายนี้ขึ้นอยู่กับกรณีที่มีเอกสารการอภิปรายชุมชนและแนวปฏิบัติที่ดีที่สุดเกี่ยวกับการใช้งาน Singleton และการจัดการหน่วยความจำใน Laravel โดยเฉพาะอย่างยิ่งการเน้นความแตกต่างของพฤติกรรมระหว่างคำขอ PHP แบบดั้งเดิมที่มีอายุสั้นและกระบวนการที่ใช้งานมานาน