1.
من خلال الاستعلام عن رمز مصدر Laravel ، يمكنك تأكيد أن الاستثناء يتم طرحه في طريقة setPdo :
<؟ phppublic function setpdo ($ pdo) {if ($ this-> Transactions> = 1) {throw new RunTimeException ("لا يمكن تبديل مثيل PDO أثناء المعاملة.") ؛ } $ this-> pdo = $ pdo ؛ إرجاع $ هذا ؛}؟> حرفيًا ، يحدث هذا الخطأ لأنه يتم تشغيل اتصال قاعدة البيانات عند تشغيل المعاملة. ومع ذلك ، في بعض الأحيان ، قد يحدث هذا الخطأ حتى إذا لم يكن الكود تبديل اتصالات قاعدة البيانات بشكل صريح. على سبيل المثال ، عندما يحدث خطأ عند تنفيذ بيان الاستعلام ، سيستخدم النظام طريقة tryAgainIfCausedByLostConnection لتحديد ما إذا كانت المشكلة ناتجة عن اتصال ضائع. إذا كان الأمر كذلك ، فسيقوم النظام بإعادة الاتصال من خلال طريقة reconnect . عند إعادة الاتصال ، سيقوم النظام ببعض أعمال التنظيف من خلال طريقة disconnect ، ويتم استدعاء طريقة setPdo .
بعد توضيح الأسباب والعواقب ، ستعرف بشكل طبيعي كيفية حل المشكلة: تحقق من موقف الشبكة وتأكيد سبب فقدان اتصال قاعدة البيانات. قد يكون هذا بسبب وجود مشكلة مع جهاز معين ، أو قد يكون ذلك بسبب إعدادات timeout غير الصحيحة. تتمثل الطريقة dirty نسبيًا في تنفيذ طريقة DB::reconnect() قبل الاستعلام وإعادة الاتصال إلى قاعدة البيانات.
2. خطأ: "لا يمكن حذف المهمة: not_found"
هذه المشكلة في الواقع لا علاقة لها بـ Laravel ، ولكنها ناجمة عن عجل خدمة قائمة الانتظار.
شحذ
لحل هذه المشكلة ، تحتاج أولاً إلى فهم دورة حياة الرسالة: عندما يتم وضع رسالة في قائمة الانتظار ، فإنها تدخل الحالة READY ، وفي الوقت نفسه ، ستربط مؤقت TTR(time to run) للإشارة إلى الوقت الذي يُسمح فيه للرسالة بالتشغيل. عندما يتم استهلاك هذه الرسالة ، فإنها تدخل الحالة RESERVED . بعد الاستهلاك ، سيتم حذف الرسالة. إذا كان وقت الاستهلاك طويلًا جدًا ، أطول من TTR ، سيعتقد النظام أن المستهلك قد علق ، ثم إعادة الرسالة من الحالة RESERVED إلى الحالة READY وتسليمها إلى مستهلك آخر لإعادة المعالجة. لذلك ، يمكن معالجة نفس الرسالة من قبل العديد من المستهلكين. يمكن للمستهلك الأول الذي قام بمعالجته حذف الرسالة بشكل طبيعي ، في حين أن المستهلكين الآخرين سيقومون بالإبلاغ عن خطأ لا يمكن حذفه عند حذف الرسالة.
الحل بسيط للغاية. أولاً ، تحتاج إلى التأكد من أن إعداد TTR لا يمكن أن يكون صغيرًا جدًا ؛ ثانياً ، يوفر Beanstalk بالفعل أمرًا خاصًا touch لحل مشكلة وقت التنفيذ الطويل. بالإضافة إلى ذلك ، قد نحتاج في بعض الأحيان إلى قفل مستوى التطبيق لتجنب الموقف الذي تتم معالجة نفس الرسالة من قبل العديد من المستهلكين في نفس الوقت.
3. الإبلاغ عن خطأ: "لا توجد نتائج استعلام للنموذج"
عندما يتم تنشيط فصل LARAVEL والكتابة ، قد يتلقى المستهلك خطأً مماثلًا عند معالجة الرسائل. أمر قائمة انتظار مع مشاكل محتملة تقريبًا على النحو التالي:
<؟ phpclass foo يمتد الأوامر الأدوات ذاتية ، يجب أن يكون {استخدام electswithqueue ، serializesmodels ؛ شريط $ المحمي. الوظيفة العامة __construct ($ id) {$ this-> bar = bar :: find ($ id) ؛ } وظيفة الدالة العامة () {// $ this-> bar}}؟> من الواضح أنه عندما يتم تشغيل فصل Laravel وقراءة الفصل ، بسبب تأخير العبد الرئيسي ، قد لا يتمكن find من الاستعلام عن البيانات المقابلة. بمجرد تحليلها هنا ، من المحتمل أن يتم تعديل طريقة الكتابة إلى ما يلي:
<؟ phpclass foo يمتد الأوامر الأدوات ذاتية ، يجب أن يكون {استخدام electswithqueue ، serializesmodels ؛ شريط $ المحمي. الوظيفة العامة __construct ($ id) {$ this-> bar = bar :: onWriteConnection ()-> find ($ id) ؛ } وظيفة الدالة العامة () {// $ this-> bar}}؟> وهذا يعني أن الاستعلام مثبت على الخادم الرئيسي من خلال طريقة onWriteConnection الخاصة بـ Laravel ، ولكنه غير صالح بالفعل. يتمثل جوهر المشكلة في أنه عند إلغاء التسلط ، سيقوم النظام باستدعاء findOrFail من الخادم.
<؟ phpprotected وظيفة getRestoredPropertyValue ($ value) {return $ value extleof identidientifier؟ (قيمة $ جديدة-> فئة)-> FindorFail ($ value-> id): $ value ؛}؟> لأننا لا HACK الإطار ، فإن onWriteConnection لا معنى له. في الواقع ، انظر إلى المشكلة من منظور مختلف. طالما أنك متسلسل ، تأكد من عدم استخدام كائنات قاعدة البيانات كسمات:
<؟ phpclass foo يمتد الأوامر الأدوات ذاتية ، يجب أن يكون {استخدام electswithqueue ، serializesmodels ؛ معرف $ المحمي ؛ الوظيفة العامة __construct ($ id) {$ this-> id = $ id ؛ } public function handle () {$ bar = bar :: onWriteConnection ()-> find ($ this-> id) ؛ }}؟>4. ملخص
ما سبق هو العديد من تقارير الأخطاء التمثيلية والحلول التي واجهتها عند استخدام Laravel. إذا كان لديك أي أسئلة ، فلا تتردد في التواصل مع بعضها البعض. آمل أن يكون هذا المقال بعض المساعدة في دراسة أو عمل الجميع.