Rebake mit Rails-Befehl oder Rake-Task funktioniert nicht, aber das Neuerstellen von HTML schon. Warum?

Hallo!

Ich versuche, Beiträge mit kaputten Bildern zu reparieren, die importiert wurden und BBcode enthalten.

Die Bilder werden in der Vorschau des Komponisten angezeigt, aber der endgültige Beitrag enthält kaputte Bilder:

Nachdem ich die Funktion „HTML neu erstellen“ für einige Beiträge verwendet und gesehen hatte, dass sie den Beitrag in meinem Produktionsforum repariert hatte, habe ich alle meine Beiträge mit der Rake-Aufgabe neu gebacken.

Ich war überrascht, dass die Beiträge mit dem kaputten Bild NICHT repariert wurden.

Also habe ich ein erneutes Backen eines bestimmten Beitrags in meinem Testforum (gleiches Backup; gleiche Daten) mit beiden Befehlen (Rails und Rake) experimentiert, und hier ist das Verhalten:

  • Die Bilder werden für eine Sekunde angezeigt, aber der Beitrag kehrt schnell zu seinem ursprünglichen Zustand mit kaputten Bildern zurück.

Wenn ich jedoch die Funktion „HTML neu erstellen“ verwende, funktioniert sie perfekt und die Bilder werden nicht wieder kaputt. Sie werden sogar nach einigen Minuten korrekt auf den Server hochgeladen.

Kann mir jemand dieses Phänomen erklären? Warum haben das erneute Backen von Rails oder einer Rake-Aufgabe dieses Verhalten, und was sind die Unterschiede zwischen dem Neuerstellen von HTML und einem erneuten Backen über die Befehlszeile?

Videoaufnahmen:

  1. aus der Rails-Konsole:

  2. aus der Rake-Aufgabe:

Ich bin sehr fasziniert (und versuche immer noch, meine Bilder in all meinen Beiträgen stapelweise zu reparieren).


Ein Beispiel, bei dem ich HTML neu erstellen verwendet habe und das zeigt, dass die eingebetteten Bilder dieses Beitrags ordnungsgemäß angezeigt und automatisch auf den Server hochgeladen wurden (offensichtlich ist ihr ursprünglicher Link, der zu casimages führt, immer noch vorhanden, aber das ist das erwartete Verhalten), vor Tagen: Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper

4 „Gefällt mir“

Ich glaube, dass die Rake-Aufgabe sie für das erneute Backen markiert und auch das Neuerstellen von Miniaturansichten auslöst. Haben Sie Sidekiq überprüft, um zu sehen, ob dort etwas in die Warteschlange gestellt wurde?

3 „Gefällt mir“

Bearbeiten:

Eine Rake-Rebake-Aufgabe für den Beitrag löst in 4 Minuten einen PullHotLinkedImages aus und erhöht sofort die Anzahl der bearbeiteten Aufgaben um eins, aber ich konnte nichts im Warteschlangen-Tab sehen.

Die wenigen Beiträge, bei denen ich einen manuellen HTML-Neubau durchgeführt habe, haben ihre Bilder seit Tagen perfekt angezeigt (sie werden auch auf meinem Server heruntergeladen).

4 „Gefällt mir“

Ich fürchte, ich weiß nicht, warum es sich vom Admin-Schraubenschlüssel unterscheidet als von der Konsole, aber ich habe dieses Thema mit einem ähnlichen Problem gefunden, und sie haben es zum Laufen gebracht, indem sie es mit der API neu gebacken haben:

Ich bin mir nicht sicher, ob das von Nutzen ist, aber ich dachte, ich teile es mit.:slightly_smiling_face:

Bearbeiten: Ich hätte einen Beitrag weiterlesen sollen. Anscheinend ist auch das unzuverlässig. Entschuldigung, mein Fehler. Falscher Alarm.

3 „Gefällt mir“

10 Beiträge wurden in ein neues Thema aufgeteilt: Cannot PullHotlinkedImages for some domains

Hat außer Jay, der einen Einblick in einen möglichen Unterschied zwischen Rake/Rails Rebake und Rebuild HTML hatte, noch jemand eine andere Idee?

Eine offizielle Antwort über die Unterschiede zwischen diesen Aufgaben wäre willkommen :slight_smile:

Wenn wir es nicht herausfinden können, werde ich den API-Weg einschlagen, um meine 40000 Beiträge „HTML neu zu erstellen“, die potenzielle Probleme mit Bildern enthalten… Und hoffe, dass es für mich funktioniert :confused: :person_shrugging:

Oder gibt es vielleicht einen anderen Weg, „HTML neu zu erstellen“ mit Rails? :thinking:

HTML neu erstellen: post.rebake!(invalidate_oneboxes: true, invalidate_broken_images: true)

Rake posts:rebake: post.rebake!(**opts), wobei opts im Allgemeinen leer ist
Für die Oneboxes können Sie die Aufgabe posts:refresh_oneboxes versuchen und für die defekten Bilder können Sie die Aufgabe posts:invalidate_broken_images versuchen. Letzteres könnte die Lösung für Ihr Problem sein.

8 „Gefällt mir“

Nachdem ich ein paar Beiträge getestet habe, scheint es wie am Schnürchen zu funktionieren! Ich werde es bei Tausenden von Beiträgen versuchen und sehen, wie es läuft! Vielen Dank!

5 „Gefällt mir“

Hier ist mein aktueller Stand:

Nachdem ich versucht habe, post.rebake!(invalidate_broken_images: true) für alle meine 40.000 Beiträge auszuführen, die den String [img] enthalten, hat es bei vielen Bildern funktioniert… Aber bei weitem nicht bei allen, obwohl sie auf demselben externen Bild-Hosting-Dienst gehostet werden.
Zum Beispiel habe ich Tausende von “funktionierenden” Casimages-Links (die auf gültige Bilder verweisen und Bilder in der Vorschau beim Bearbeiten anzeigen), die in der “gebackenen” Version der Beiträge kaputt sind, die aber dank meines Skripts ordnungsgemäß auf dem Server angezeigt und hochgeladen wurden. Aber ich habe auch viele andere, bei denen es einfach nicht funktioniert hat, und ich weiß nicht warum.

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

Ich habe auch Bildlinks von anderen Bild-Hostern, die hochgeladen wurden, und einige, bei denen es nicht funktioniert hat.
Ich konnte keinen Unterschied zwischen diesen Beiträgen und Bildlinks feststellen. Sie enthielten alle funktionierende Bilder, und die Tatsache, dass sie denselben Bild-Hoster verwendeten, hat mich verwirrt.
Ich habe den Vorgang mehrmals versucht und die Ergebnisse waren inkonsistent, unabhängig von den externen Hosting-Diensten… Einige Bilder wurden hochgeladen, andere nicht. Es schien zufällig zu sein.
Es erinnert mich ein wenig an das Problem, das @Amethi hatte: Some linked images not displaying/show as broken - #8 by Amethi, wo es nur bei einigen Bildern ohne Erklärung funktionierte.


:information_source: Ich werde hier nur über Casimages sprechen, obwohl mein importiertes Forum verschiedene andere Bild-Hoster verwendete.

Also dachte ich, dass Casimages vielleicht meine IP vorübergehend sperrt, wenn ich versuche, zu viele Bilder von ihren Servern abzurufen. Das könnte erklären, warum es nicht bei allen Bildern funktioniert hat und warum der Erfolg beim Hochladen der Bilder von meinem Server zufällig war.
Es gab sogar Fälle, in denen die Option “HTML neu generieren” funktionierte - zunächst nur -, die Bilder wurden dann angezeigt, anstatt ein kaputtes Bildsymbol anzuzeigen, obwohl sie immer noch auf ihrem externen Hosting-Dienst gehostet wurden. Aber als die Sidekiq-Aufgabe “Externe Bilder abrufen” ausgelöst wurde, wurden die Bilder kaputt.
Dasselbe gilt für die Verwendung von Rail-Skripten mit rebake!(invalidate_broken_images: true).
:weary:

Daher versuche ich derzeit einen langsameren Ansatz, bei dem ich 5 Sekunden zwischen jedem meiner Rail-rebake!-Befehle warte:

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

Ich werde in etwa 60 Stunden sehen, ob es besser gelaufen ist…

Ich möchte die Grundlagen meines Problems hier verstehen und warum ein “normales” rebake ein Bild nicht auf dem Server hochladen kann (wenn ich nicht vorübergehend von Casimages gesperrt werde).

Beachten Sie, dass dieses Mal das Zertifikat des Casimages-Servers in Ordnung zu sein scheint:smile:

Ich verstehe auch nicht, was invalidate_broken_images wirklich tut. Ich bin mit dem Code von Discourse nicht sehr vertraut.

Ich habe mir den Code angesehen, um die Vorkommen von invalidate_broken_images zu sehen, und diese Dateien gefunden:

Warum wird speziell nach dem String <img> gesucht? Meine Beiträge stammen aus einem importierten phpBB und die Rohversion enthält nur [img] BBCode, keine <img>-Tags. Wie könnte es also (und es hat, siehe meine vorherige Nachricht) Auswirkungen auf meine Beiträge haben? :thinking:

Ich verstehe auch nicht wirklich den Unterschied zwischen diesen beiden Methoden (?):

Es scheint zu sagen, dass rebake die Standardargumente auf false setzt und dass rebake! das Standardargument auf true setzt.

Wie hängen diese beiden zusammen (ich bin mir übrigens des Zwecks des !-Zeichens in Ruby bewusst) und warum befinden sie sich in verschiedenen Dateien?

Mein Ziel ist es nur zu verstehen, warum meine externen Bilder manchmal hochgeladen werden und manchmal nicht, und ob ich einen zuverlässigen Weg finden kann, sie ordnungsgemäß und automatisch hochzuladen, auch wenn dies bedeutet, stündlich ein Bild hochzuladen. :sweat_smile:
Ich arbeite seit fast zwei Wochen daran und es macht mich (und die Leute, für die ich ihren Server migriert habe) wahnsinnig. :woozy_face:

Außerdem gibt es nichts im Discourse-Log, außer mehreren Meldungen wie Sidekiq is consuming too much memory (using: 592.25M). Beachten Sie, dass ich unter Ubuntu über WSL unter Windows 10 arbeite, aber ich beabsichtige, eine funktionierende Lösung (wenn ich eine finde…) auf unserem VPS zu verwenden.

1 „Gefällt mir“

Es ist weiter unten dort, wo Sie sehen, was es in Zeile 716 tut. Es löscht diese Bilder, damit es versucht, sie erneut herunterzuladen. (zumindest auf den ersten Blick)

1 „Gefällt mir“

Vielen Dank für diese Erklärung. :slight_smile:


Ich bin also fast bei meinen 55 Stunden, in denen ich meine Beiträge mit [img] neu backe, mit einer Verzögerung von 5 Sekunden zwischen jeder Iteration meiner 40000 Beiträge aus meinem Rails-Skript.

Soweit ich das beurteilen kann, funktioniert es viel besser als zuvor. Die meisten gültigen Bilder (ich schließe Imageshack und sein erratisches Verhalten aus) scheinen auf den ersten Blick fehlerfrei auf meinem Forum hochgeladen zu werden, aber ich werde es genauer untersuchen, um 100% sicher zu sein. Was 100% sicher ist, ist, dass die Ergebnisse weitaus besser und konsistenter sind.

Ich vermute also, dass das Problem, auf das ich gestoßen bin (und vielleicht das Problem von @Amethi), das zufällig beim Herunterladen von Remote-Bildern mit invalidate_broken_images auftrat, mit einer Art Ratenbegrenzung von verschiedenen Bild-Hosting-Anbietern zusammenhing…? :thinking: Das Seltsame ist, dass ich bei meinen anderen importierten Foren keine Probleme bemerkt habe… :face_with_raised_eyebrow:


Wenn die Ergebnisse zufriedenstellend sind und die Verzögerung das Herunterladen von Remote-Bildern wirklich verbessert, werde ich die gleiche Methode auf meinem Produktionsforum anwenden, aber ich werde die Zeit zwischen jedem neu gebackenen Beitrag von 5 Sekunden auf 10 oder 15 Sekunden (oder sogar mehr) erhöhen. Wir haben es nicht eilig, dies sind alles ziemlich alte Beiträge, und der VPS hat weitaus geringere Spezifikationen als mein eigener Computer.

Ich möchte nicht zu schnell Schlussfolgerungen ziehen, aber die Lösung für mein ursprüngliches Problem könnte darin bestehen, sowohl die von Richard vorgeschlagene Lösung anzuwenden UND eine Verzögerung zwischen jedem Post-Rebake hinzuzufügen.

3 „Gefällt mir“

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