1. รายงานข้อผิดพลาด: "ไม่สามารถแลกเปลี่ยนอินสแตนซ์ PDO ในขณะที่อยู่ในการทำธุรกรรม"
โดยการสอบถามซอร์สโค้ด Laravel คุณสามารถยืนยันได้ว่าข้อยกเว้นนั้นถูกโยนลงในวิธี setPdo :
<? ฟังก์ชั่น phppublic setpdo ($ pdo) {ถ้า ($ this-> ธุรกรรม> = 1) {โยน runtimeException ใหม่ ("ไม่สามารถเปลี่ยนอินสแตนซ์ PDO ในขณะที่อยู่ในธุรกรรม"); } $ this-> pdo = $ pdo; ส่งคืน $ this;}?> แท้จริงข้อผิดพลาดนี้เกิดขึ้นเนื่องจากการเชื่อมต่อฐานข้อมูลถูกสลับเมื่อเปิดธุรกรรม อย่างไรก็ตามบางครั้งข้อผิดพลาดนี้อาจเกิดขึ้นแม้ว่ารหัสจะไม่สลับการเชื่อมต่อฐานข้อมูลอย่างชัดเจน ตัวอย่างเช่นเมื่อเกิดข้อผิดพลาดเมื่อดำเนินการคำสั่งค้นหาระบบจะใช้วิธีการ tryAgainIfCausedByLostConnection เพื่อตรวจสอบว่าปัญหาเกิดจากการสูญเสียการเชื่อมต่อหรือไม่ ถ้าเป็นเช่นนั้นระบบจะเชื่อมต่อผ่านวิธี reconnect เมื่อเชื่อมต่อใหม่ระบบจะทำการทำความสะอาดบางอย่างผ่านวิธีการ disconnect และวิธีการ setPdo จะถูกเรียก
หลังจากชี้แจงสาเหตุและผลที่ตามมาคุณจะรู้วิธีแก้ปัญหาโดยธรรมชาติ: ตรวจสอบสถานการณ์เครือข่ายและยืนยันสาเหตุของการสูญเสียการเชื่อมต่อฐานข้อมูล อาจเป็นเพราะมีปัญหากับอุปกรณ์บางอย่างหรืออาจเป็นเพราะการตั้งค่า timeout ที่ไม่เหมาะสม วิธีที่ค่อนข้าง dirty คือการเรียกใช้วิธี DB::reconnect() ก่อนที่จะสอบถามและเชื่อมต่อกับฐานข้อมูลอีกครั้ง
2. ข้อผิดพลาด: "ไม่สามารถลบงานได้: not_found"
ปัญหานี้ไม่มีส่วนเกี่ยวข้องกับ Laravel แต่เกิดจาก Beanstalk บริการคิว
ถั่วลันเตา
ในการแก้ปัญหานี้คุณต้องเข้าใจวงจรชีวิตของข้อความก่อน: เมื่อมีการวางข้อความไว้ในคิวมันจะเข้าสู่สถานะ READY และในเวลาเดียวกันมันจะเชื่อมโยงตัวจับเวลา TTR(time to run) เพื่อระบุเวลาที่ข้อความได้รับอนุญาตให้ทำงาน เมื่อมีการใช้ข้อความนี้เข้าสู่สถานะ RESERVED หลังจากการบริโภคข้อความจะถูกลบ หากเวลาการบริโภคยาวเกินไปนานกว่า TTR ระบบจะคิดว่าผู้บริโภคได้วางสายแล้วกลับข้อความจากสถานะ RESERVED ไปยังสถานะ READY และส่งมอบให้กับผู้บริโภครายอื่นเพื่อการประมวลผลใหม่ ดังนั้นข้อความเดียวกันอาจถูกประมวลผลโดยผู้บริโภคหลายราย ผู้บริโภครายแรกที่ประมวลผลสามารถลบข้อความได้ตามปกติในขณะที่ผู้บริโภครายอื่นจะรายงานข้อผิดพลาดที่ไม่สามารถลบได้เมื่อลบข้อความ
การแก้ปัญหานั้นง่ายมาก ก่อนอื่นคุณต้องตรวจสอบให้แน่ใจว่าการตั้งค่า TTR ไม่เล็กเกินไป ประการที่สอง Beanstalk ให้คำสั่ง touch พิเศษเพื่อแก้ปัญหาเวลาดำเนินการที่ยาวเกินไป นอกจากนี้บางครั้งเราอาจต้องล็อคที่ระดับแอปพลิเคชันเพื่อหลีกเลี่ยงสถานการณ์ที่ผู้บริโภคหลายคนประมวลผลข้อความเดียวกันในเวลาเดียวกัน
3. รายงานข้อผิดพลาด: "ไม่มีผลลัพธ์การสืบค้นสำหรับโมเดล"
เมื่อเปิดใช้งานการแยกและเขียน Laravel ผู้บริโภคอาจได้รับข้อผิดพลาดที่คล้ายกันเมื่อประมวลผลข้อความ คำสั่งคิวที่มีปัญหาที่อาจเกิดขึ้นมีดังนี้:
<? phpclass foo ขยายคำสั่งใช้การใช้ตนเอง self -bequeued {ใช้ interactswithqueue, serializesmodels; ได้รับการปกป้อง $ bar; ฟังก์ชั่นสาธารณะ __Construct ($ id) {$ this-> bar = bar :: find ($ id); } ฟังก์ชั่นสาธารณะที่จับ () {// $ this-> bar}}?> เป็นที่ชัดเจนว่าเมื่อ Laravel อ่านและเขียนการแยกถูกเปิดใช้งานเนื่องจากความล่าช้าของ Master-Slave find อาจไม่สามารถสอบถามข้อมูลที่เกี่ยวข้องได้ เมื่อเราวิเคราะห์แล้วที่นี่มีแนวโน้มว่าวิธีการเขียนจะได้รับการแก้ไขดังต่อไปนี้:
<? phpclass foo ขยายคำสั่งใช้การใช้ตนเอง self -bequeued {ใช้ interactswithqueue, serializesmodels; ได้รับการปกป้อง $ bar; ฟังก์ชั่นสาธารณะ __Construct ($ id) {$ this-> bar = bar :: onWriteConnection ()-> ค้นหา ($ id); } ฟังก์ชั่นสาธารณะที่จับ () {// $ this-> bar}}?> กล่าวคือแบบสอบถามถูกตรึงไว้ในเซิร์ฟเวอร์หลักผ่านวิธี onWriteConnection ของ Laravel แต่มันไม่ถูกต้องจริง ปัญหาของปัญหาคือเมื่อ deserialization ระบบจะเรียก findOrFail จากเซิร์ฟเวอร์
<? ฟังก์ชั่น phpprotected getRestoredPropertyValue ($ value) {return $ value instanceof modelIdentifier? (ใหม่ $ value-> คลาส)-> findorFail ($ value-> id): $ value;}?> เนื่องจากเราไม่สามารถ HACK เข้าสู่กรอบ onWriteConnection ได้ ในความเป็นจริงดูปัญหาจากมุมมองที่แตกต่างกัน ตราบใดที่คุณยังคงเป็นอนุกรมตรวจสอบให้แน่ใจว่าไม่ใช้วัตถุฐานข้อมูลเป็นแอตทริบิวต์:
<? phpclass foo ขยายคำสั่งใช้การใช้ตนเอง self -bequeued {ใช้ interactswithqueue, serializesmodels; ได้รับการปกป้อง $ id; ฟังก์ชั่นสาธารณะ __Construct ($ id) {$ this-> id = $ id; } ฟังก์ชั่นสาธารณะที่จับ () {$ bar = bar :: onWriteConnection ()-> ค้นหา ($ this-> id); -4. สรุป
ข้างต้นเป็นรายงานข้อผิดพลาดที่เป็นตัวแทนและโซลูชันที่ฉันพบเมื่อใช้ Laravel หากคุณมีคำถามใด ๆ โปรดสื่อสารซึ่งกันและกัน ฉันหวังว่าบทความนี้จะช่วยในการศึกษาหรือทำงานของทุกคน