لماذا لا يعمل أمر rails أو مهمة rake لإعادة الخبز، بينما يعمل إعادة بناء HTML؟

أهلاً!

أحاول إصلاح المشاركات التي تحتوي على صور تالفة، تم استيرادها وتحتوي على BBcode.

تظهر الصور في معاينات المحرر، لكن محتوى المشاركة النهائي يحتوي على صور تالفة:

بعد استخدام ميزة “إعادة بناء HTML” على بعض المشاركات ورؤية أنها أصلحت المشاركة في منتدى الإنتاج الخاص بي، قمت بإعادة خبز جميع مشاركاتي باستخدام مهمة rake.

فوجئت برؤية أن المشاركات ذات الصورة التالفة لم يتم إصلاحها.

لذلك قمت بتجربة إعادة خبز لمشاركة معينة على منتدى الاختبار الخاص بي (نفس النسخ الاحتياطي؛ نفس البيانات) باستخدام أمر rails ومهمة rake، وهذا هو السلوك:

  • تظهر الصور للحظة، لكن المشاركة تعود بسرعة إلى حالتها الأولية بصور تالفة.

ومع ذلك، إذا استخدمت ميزة “إعادة بناء HTML”، فإنها تعمل بشكل مثالي، ولا تعود الصور إلى كونها تالفة. بل يتم تحميلها بشكل صحيح على الخادم بعد بضع دقائق.

إذن، هل يمكن لأحد أن يشرح هذه الظاهرة؟ لماذا يكون لإعادة الخبز من rails أو مهمة rake هذا السلوك، وما هي الاختلافات بين إعادة بناء HTML و إعادة الخبز من سطر الأوامر؟

تسجيلات الفيديو:

  1. من وحدة تحكم rails:

  2. من مهمة rake:

أنا مفتون جدًا (وما زلت أحاول إصلاح صوري في جميع مشاركاتي دفعة واحدة).


مثال استخدمت فيه إعادة بناء HTML والذي يوضح أن الصور المضمنة في هذه المشاركة تم عرضها بشكل صحيح وتم تحميلها تلقائيًا على الخادم (من الواضح أن رابطها الأصلي، الذي يؤدي إلى casimages، لا يزال موجودًا، ولكنه السلوك المتوقع)، قبل أيام: Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper

4 إعجابات

أعتقد أن مهمة rake تحددها لإعادة الخبز وتشغل أيضًا إعادة بناء الصور المصغرة. هل تحققت من sidekiq لمعرفة ما إذا كانت هناك أشياء في قائمة الانتظار؟

3 إعجابات

تعديل:
تؤدي مهمة إعادة بناء الـ rake على المنشور إلى تشغيل PullHotLinkedImages في غضون 4 دقائق وتزيد أيضًا على الفور من عدد المهام التي تمت معالجتها بواحد، ولكن لم أتمكن من رؤية أي شيء تمت إضافته إلى علامة التبويب “الانتظار”.
تم عرض الصور بشكل مثالي لعدة أيام الآن (تم تنزيلها على خادمي أيضًا) على المنشورات القليلة التي أجريت عليها إعادة بناء يدوية لـ HTML.

4 إعجابات

أخشى أنني لا أعرف لماذا يعمل بشكل مختلف عن أداة المسؤول مقارنة بوحدة التحكم، ولكني وجدت هذا الموضوع الذي يتضمن مشكلة مماثلة، وتمكنوا من جعله يعمل عن طريق إعادة الخبز باستخدام واجهة برمجة التطبيقات:

https://meta.discourse.org/t/some-linked-images-not-displaying-show-as-broken/142177/7

لست متأكدًا مما إذا كان هذا مفيدًا، لكنني اعتقدت أنني سأشاركه.:slightly_smiling_face:

تعديل: كان يجب أن أقرأ منشورًا واحدًا إضافيًا. يبدو أن هذا أيضًا غير موثوق به. آسف، خطئي. إنذار كاذب.

3 إعجابات

تم تقسيم 10 مشاركات إلى موضوع جديد: Cannot PullHotlinkedImages for some domains

بخلاف جاي الذي ألقى نظرة على فرق محتمل بين إعادة خبز/قضبان إعادة البناء و إعادة بناء HTML، هل لدى أي شخص فكرة أخرى؟

نرحب برد رسمي حول الاختلافات بين هذه المهام :slight_smile:

إذا لم نتمكن من معرفة ذلك، سأبدأ بطريقة API لـ “إعادة بناء HTML” لـ 40000 مشاركة لدي تحتوي على مشاكل محتملة مع الصور… وآمل أن ينجح ذلك بالنسبة لي :confused: :person_shrugging:

أو إذا كانت هناك أي طريقة أخرى لـ “إعادة بناء HTML” باستخدام rails، ربما؟ :thinking:

إعادة بناء HTML: post.rebake!(invalidate_oneboxes: true, invalidate_broken_images: true)

Rake posts:rebake: post.rebake!(**opts) حيث opts فارغة بشكل عام
بالنسبة لـ Oneboxes يمكنك تجربة المهمة posts:refresh_oneboxes وبالنسبة للصور المكسورة يمكنك تجربة المهمة posts:invalidate_broken_images. قد يكون هذا الأخير هو الحل لمشكلتك.

8 إعجابات

بعد اختبار على عدد قليل من المشاركات، يبدو أنه يعمل بشكل رائع!
سأجرب على آلاف المشاركات وأرى كيف ستسير الأمور! شكراً جزيلاً!

5 إعجابات

إذًا، هذا هو وضعي الحالي:

بعد محاولة تشغيل post.rebake!(invalidate_broken_images: true) على جميع منشوراتي البالغ عددها 40000 والتي تحتوي على السلسلة النصية [img]، نجحت مع العديد من الصور… ولكنها لم تنجح مع الكثير منها، على الرغم من أنها مستضافة على نفس خدمة استضافة الصور الخارجية.
على سبيل المثال، لدي آلاف روابط “casimages” التي تعمل (وتربط بصور صالحة، وتعرض الصور في معاينة المحرر عند التعديل)، وهي معطلة في النسخة المطهوة من المنشورات، والتي تم عرضها وتحميلها بشكل صحيح على الخادم بفضل برنامجي النصي، ولكن لدي أيضًا الكثير من الروابط الأخرى التي لم تنجح ببساطة، ولا أعرف السبب.

Post.where('raw LIKE ?', '%[img]%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
end

لدي أيضًا روابط صور من خدمات استضافة صور أخرى تم تحميلها، وبعضها لم ينجح.
فشلت في رؤية أي فرق بين هذه المنشورات وروابط الصور. كلها كانت تحتوي على صور عاملة، وحقيقة أنها استخدمت نفس خدمة استضافة الصور أربكتني.
حاولت العملية عدة مرات وكانت النتائج غير متسقة، بغض النظر عن خدمات الاستضافة الخارجية… تم تحميل بعض الصور، ولم يتم تحميل البعض الآخر. بدا الأمر عشوائيًا.
يذكرني هذا قليلاً بالمشكلة التي واجهها @Amethi: Some linked images not displaying/show as broken - #8 by Amethi حيث نجحت مع بعض الصور فقط دون أي تفسير.


:information_source: سأتحدث فقط عن casimages هنا على الرغم من أن منتدى الاستيراد الخاص بي استخدم خدمات استضافة صور أخرى متنوعة.

لذلك، اعتقدت أنه ربما قامت casimages بحظر عنوان IP الخاص بي مؤقتًا إذا حاولت استرداد عدد كبير جدًا من الصور من خوادمها. يمكن أن يفسر ذلك حقيقة أنها لم تنجح مع جميع الصور والعشوائية في نجاح تحميل الصور من خادمي.
كانت هناك حتى حالات نجحت فيها خيار إعادة بناء HTML - في البداية فقط - وتم عرض الصور بعد ذلك بدلاً من إظهار أيقونة صورة مكسورة، على الرغم من أنها كانت لا تزال مستضافة على خدمة الاستضافة الخارجية الخاصة بها، ولكن عندما تم تشغيل مهمة Sidekiq لسحب الصور الخارجية، أدت إلى كسر الصور.
نفس الشيء عند استخدام برامج نصية بلغة Rails مع rebake!(invalidate_broken_images: true)
:weary:

لذلك، أنا حاليًا أجرب نهجًا أبطأ، حيث أنتظر 5 ثوانٍ بين كل أمر rebake! في Rails:

total = Post.where('lower(raw) LIKE ?', '%[img]https:%').count
i = 0
Post.where('raw LIKE ?', '%[img]https:%').find_each do |p|
    p.rebake!(invalidate_broken_images: true)
    print "#{i}/#{total}"
    print "\r"
    i +=1
    sleep(5)
end

سأرى بعد حوالي 60 ساعة ما إذا كان الوضع قد تحسن…

أود أن أفهم أساسيات مشكلتي هنا ولماذا لا يمكن لـ “rebake” العادي تحميل صورة على الخادم (إذا لم يتم حظري مؤقتًا بواسطة casimages).

لاحظ أن هذه المرة، شهادة خادم casimages تبدو جيدة:smile:

أنا أيضًا لا أفهم حقًا ما تفعله invalidate_broken_images. أنا لست على دراية كبيرة بكود Discourse.

نظرت إلى الكود لرؤية تكرار invalidage_broken_images ورأيت هذه الملفات:

لماذا يبحث تحديدًا عن السلسلة النصية <img>؟ منشوراتي مستوردة من phpBB والإصدار الخام يحتوي فقط على [img] bbCode، وليس علامات <img>؛ فكيف سيكون له تأثير (وقد كان، انظر رسالتي السابقة) على منشوراتي؟ :thinking:

أنا أيضًا لا أفهم حقًا الفرق بين هذين الأسلوبين (؟):

يبدو أنه يخبر أن rebake يضبط الوسائط الافتراضية على false، وأن rebake! يضبط الوسيط الافتراضي على true.
كيف يرتبط هذان (أنا على دراية بمعنى علامة ! في Ruby بالمناسبة)، ولماذا هما في ملفات مختلفة؟

هدفي هو فقط فهم سبب تحميل صوري الخارجية أحيانًا، وأحيانًا لا، وما إذا كان بإمكاني العثور على طريقة موثوقة لتحميلها بشكل صحيح وتلقائي، حتى لو كان ذلك يعني تحميل صورة كل ساعة. :sweat_smile:
لقد أمضيت ما يقرب من أسبوعين في هذا الأمر وهو يدفعني (والأشخاص الذين قمت بترحيل خادمهم لهم) إلى الجنون. :woozy_face:

أيضًا، لا يوجد شيء في سجلات Discourse، بخلاف رسائل متعددة تفيد بأن Sidekiq يستهلك الكثير من الذاكرة (يستخدم: 592.25M). لاحظ أنني أعمل على Ubuntu عبر WSL على Windows 10، ولكنني أنوي استخدام حل فعال (إذا وجدت واحدًا…) على خادمنا الافتراضي.

إعجاب واحد (1)

إنه أبعد في الأسفل حيث ترى ما يفعله في السطر 716. يقوم بحذف تلك الصور حتى يحاول تنزيلها مرة أخرى. (للوهلة الأولى على أي حال)

إعجاب واحد (1)

شكراً لك على هذا الشرح. :slight_smile:


إذن، لقد اقتربت من 55 ساعة من إعادة خبز مشاركاتي التي تحتوي على [img] مع تأخير لمدة 5 ثوانٍ بين كل تكرار من مشاركاتي البالغ عددها 40000 من نص Rails الخاص بي.

مما أراه، فإنه يعمل بشكل أفضل بكثير من ذي قبل. يبدو أن معظم الصور الصالحة (أستثني Imageshack وسلوكه المتقلب) يتم تحميلها إلى منتدىي بشكل لا تشوبه شائبة للوهلة الأولى على الأقل، ولكنني سألقي نظرة أعمق لأكون متأكداً بنسبة 100%. ما هو مؤكد بنسبة 100% هو أن النتائج أفضل بكثير وأكثر اتساقاً.

لذلك أشك في المشكلة التي واجهتها (وربما المشكلة issue من @Amethi) والتي كانت عشوائية في تنزيل الصور عن بعد باستخدام invalidate_broken_images مرتبطة بنوع من الحد الأقصى للمعدل من مختلف مزودي استضافة الصور…؟ :thinking: الشيء الغريب هو أنني لم ألاحظ أي مشكلة مع منتدياتي المستوردة الأخرى… :face_with_raised_eyebrow:


ومع ذلك، إذا كانت النتائج مرضية بما فيه الكفاية والتأخير يحسن تنزيل الصور عن بعد حقاً، فسأقوم بنفس الطريقة على منتدى الإنتاج الخاص بي، ولكنني سأزيد الوقت بين كل إعادة خبز للمشاركات من 5 ثوانٍ إلى 10 أو 15 ثانية (أو حتى أكثر، نحن لسنا في عجلة من أمرنا، هذه كلها مشاركات قديمة جداً، والمخدم الافتراضي الخاص لديه مواصفات أقل بكثير من جهازي الخاص).

لا أريد أن أكون استنتاجياً بسرعة كبيرة، ولكن الحل لمشكلتي الأولية قد يكون تطبيق كل من الحل الذي اقترحه Richard وإضافة تأخير بين كل إعادة خبز للمشاركات.

3 إعجابات

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.