Dopo aver utilizzato la funzione “rebuild HTML” su alcuni post e aver visto che ha riparato il post sul mio forum di produzione, ho rieseguito il rebake di tutti i miei post utilizzando il task rake.
Sono rimasto sorpreso nel vedere che i post con l’immagine non funzionante NON sono stati riparati.
Quindi ho sperimentato un rebake su un post specifico sul mio forum di test (stesso backup; stessi dati) sia con il comando rails che con il task rake, ed ecco il comportamento:
Le immagini vengono visualizzate per un secondo, ma il post torna rapidamente al suo stato iniziale con immagini non funzionanti.
Tuttavia, se utilizzo la funzione “rebuild HTML”, funziona perfettamente e le immagini non tornano a essere non funzionanti. Vengono persino caricate correttamente sul server dopo qualche minuto.
Quindi, qualcuno può spiegare questo fenomeno? Perché il rebake da rails o da un task rake ha questo comportamento e quali sono le differenze tra rebuilding HTML e un rebake da riga di comando?
Catture video:
dalla console rails:
dal task rake:
Sono molto incuriosito (e sto ancora cercando di riparare le mie immagini in tutti i miei post in batch).
Un esempio in cui ho utilizzato Rebuild HTML che mostra che le immagini incorporate di questo post sono state visualizzate correttamente e caricate automaticamente sul server (ovviamente, il loro link originale, che porta a casimages, è ancora presente, ma questo è il comportamento previsto), giorni fa: Frensh Vw Bus CHERIZET 2019 SK - #13 par buggyderby - Vos sorties - VW Camper
Penso che il rake task li contrassegni per il rebake e attivi anche la ricostruzione delle miniature. Hai controllato sidekiq per vedere se ci sono elementi in coda?
Un’attività di rebake rake sul post attiva un PullHotLinkedImages in 4 minuti e aumenta anche istantaneamente il numero di attività elaborate di uno, ma non ho visto nulla aggiunto alla scheda della coda.
I pochi post su cui ho eseguito una ricostruzione manuale dell’HTML hanno visualizzato perfettamente le loro immagini per giorni (sono state scaricate anche sul mio server).
<sTemo di non sapere perché funzioni diversamente dalla chiave inglese dell’amministratore rispetto alla console, ma ho trovato questo argomento con un problema simile e sono riusciti a farlo funzionare ribattendo tramite l’API:
Oltre a Jay, che ha intravisto una possibile differenza tra rebake/rails rebake e rebuild HTML, qualcun altro ha un’idea?
Una risposta ufficiale sulla differenza (o le differenze) tra questi task sarebbe gradita
Se non riusciamo a capirlo, inizierò la via API per “ricostruire l’HTML” dei miei 40000 post contenenti potenziali problemi con le immagini… E spero che funzioni per me
O se c’è un altro modo per “ricostruire l’HTML” usando rails, forse?
Rake posts:rebake: post.rebake!(**opts) dove opts è generalmente vuoto
Per i Onebox puoi provare il task posts:refresh_oneboxes e per le immagini non valide puoi provare il task posts:invalidate_broken_images. Quest’ultimo potrebbe essere la soluzione al tuo problema.
Dopo aver provato a eseguire post.rebake!(invalidate_broken_images: true) su tutti i miei 40000 post che contengono la stringa [img], ha funzionato per molte immagini… Ma ben lungi dall’essere tutte, nonostante fossero ospitate sullo stesso servizio di hosting di immagini esterno.
Ad esempio, ho migliaia di link “funzionanti” di casimages (che puntano a immagini valide e mostrano le immagini nell’anteprima del composer in modifica), rotti nella versione “cotto” dei post, che sono stati correttamente visualizzati e caricati sul server grazie al mio script, ma ho anche molti altri in cui semplicemente non ha funzionato, e non so perché.
Post.where('raw LIKE ?', '%[img]%').find_each do |p|
p.rebake!(invalidate_broken_images: true)
end
Ho anche link di immagini da altri hoster che sono stati caricati, e alcuni su cui non ha funzionato.
Non sono riuscito a vedere alcuna differenza tra questi post e i link delle immagini. Avevano tutti immagini funzionanti, e il fatto che utilizzassero lo stesso hoster di immagini mi ha lasciato perplesso.
Ho provato l’operazione più volte e i risultati sono stati incoerenti, indipendentemente dai servizi di hosting esterni… Alcune immagini sono state caricate, altre no. Sembrava casuale.
Mi ricorda un po’ il problema riscontrato da @Amethi: Some linked images not displaying/show as broken - #8 by Amethi dove ha funzionato solo su alcune immagini senza alcuna spiegazione.
Parlerò solo di casimages qui, anche se il mio forum importato utilizzava vari altri hoster di immagini.
Quindi, ho pensato che forse casimages ha temporaneamente messo nella blacklist il mio IP se provavo a recuperare troppe immagini dai loro server. Questo potrebbe spiegare sia il fatto che non ha funzionato per tutte le immagini sia la casualità del successo del caricamento delle immagini dal mio server.
Ci sono stati anche casi in cui l’opzione Rebuild HTML ha funzionato - inizialmente solo -, le immagini venivano quindi visualizzate invece di mostrare un’icona di immagine rotta, sebbene fossero ancora ospitate sul loro servizio di hosting esterno, ma quando è stata attivata l’attività Sidekiq di pull delle immagini esterne, le immagini si sono rotte.
Lo stesso vale utilizzando script rail con rebake!(invalidate_broken_images: true)
Quindi, sto attualmente provando un approccio più lento, in cui attendo 5 secondi tra ogni comando rail rebake!:
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
Vedrò tra circa 60 ore se è andata meglio…
Vorrei capire i fondamenti del mio problema qui e perché un “normale” rebake non riesce a caricare un’immagine sul server (se non sono temporaneamente messo nella blacklist da casimages).
Nota che questa volta, il certificato del server di casimages sembra OK
Inoltre, non capisco cosa faccia realmente invalidate_broken_images. Non ho molta familiarità con il codice di Discourse.
Ho guardato il codice per vedere l’occorrenza di invalidate_broken_images e ho visto questi file:
Perché cerca specificamente la stringa <img>? I miei post provengono da un phpBB importato e la versione raw contiene solo il bbCode [img], non i tag <img>; quindi come potrebbe avere un effetto (e lo ha avuto, vedi il mio messaggio precedente) sui miei post?
Inoltre, non capisco davvero la differenza tra questi due metodi (?):
Sembra indicare che rebake imposti gli argomenti predefiniti su false, e che rebake! imposti l’argomento predefinito su true.
Come sono correlate queste due cose (sono a conoscenza dello scopo del carattere ! in ruby, tra l’altro), e perché si trovano in file diversi?
Il mio obiettivo è solo capire perché le mie immagini esterne a volte vengono caricate, a volte no, e se posso trovare un modo affidabile per caricarle correttamente e automaticamente, anche se ciò implica caricare un’immagine ogni ora.
Sono quasi due settimane che ci lavoro e sta facendo impazzire me (e le persone per cui ho migrato il server).
Inoltre, non c’è nulla nei log di Discourse, a parte diversi Sidekiq is consuming too much memory (using: 592.25M). Nota che sto lavorando su Ubuntu tramite WSL su Windows 10, ma intendo utilizzare una soluzione funzionante (se ne trovo una…) sul nostro VPS.
Quindi, sono quasi alle mie 55 ore di rifacimento dei miei post contenenti [img] con un ritardo di 5 secondi tra ogni iterazione dei miei 40000 post dal mio script rails.
Da quello che vedo, funziona molto meglio di prima. La maggior parte delle immagini valide (escludo Imageshack e il suo comportamento erratico) sembra essere caricata sul mio forum senza intoppi almeno a prima vista, ma darò un’occhiata più approfondita per essere sicuro al 100%. Ciò che è sicuro al 100% è che i risultati sono molto, molto migliori e coerenti.
Quindi sospetto che il problema che ho riscontrato (e forse il problema di @Amethi) che era la casualità nel download di immagini remote con invalidate_broken_images fosse correlato a una sorta di limite di frequenza da vari provider di hosting di immagini…? La cosa strana è che non ho notato alcun problema con i miei altri forum importati…
Detto questo, se i risultati sono sufficientemente soddisfacenti e il ritardo migliora davvero il download di immagini remote, userò lo stesso metodo sul mio forum di produzione, ma aumenterò il tempo tra ogni post rifatto da 5 secondi a 10 o 15 secondi (o anche di più, non abbiamo fretta, questi sono tutti post piuttosto vecchi e il VPS ha specifiche molto inferiori rispetto al mio computer).
Non voglio essere troppo frettoloso nel trarre conclusioni, ma la soluzione al mio problema iniziale potrebbe essere quella di applicare sia la soluzione proposta da Richard SIA aggiungere un ritardo tra ogni rifacimento di post.