Итак, вот где я сейчас нахожусь:
После попытки выполнить post.rebake!(invalidate_broken_images: true) для всех моих 40 000 постов, содержащих строку [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, где это работало только для некоторых изображений без какого-либо объяснения.
Здесь я буду говорить только о casimages, хотя на импортированном мной форуме использовались и другие хостинги изображений.
Так что я подумал, что возможно casimages временно заблокировал мой IP-адрес, если я попытался получить слишком много изображений с их серверов. Это могло бы объяснить как тот факт, что это не сработало для всех изображений, так и случайность успешной загрузки изображений с моего сервера.
Бывали даже случаи, когда опция «Rebuild HTML» работала — только сначала — изображения затем отображались вместо значка битого изображения, хотя они всё ещё хранились на их внешнем хостинге, но когда запускалась задача Sidekiq по подтягиванию внешних изображений, изображения ломались.
То же самое при использовании rail-скриптов с rebake!(invalidate_broken_images: true).
![]()
Поэтому я сейчас пробую более медленный подход, ожидая 5 секунд между каждой командой 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
Я посмотрю примерно через 60 часов, стало ли лучше…
Мне хотелось бы понять основы моей проблемы здесь и почему «обычный» rebake не может загрузить изображение на сервер (если я не был временно заблокирован casimages).
Обратите внимание, что на этот раз сертификат сервера casimages выглядит в порядке ![]()
Также я не понимаю, что именно делает invalidate_broken_images. Я не очень хорошо знаком с кодом Discourse.
Я посмотрел в коде упоминания invalidate_broken_images и нашел эти файлы:
Почему он ищет конкретно строку <img? Мои посты импортированы из phpBB, и в исходной версии содержатся только теги bbCode [img], а не теги <img>; так как же это могло повлиять на мои посты (и повлияло, см. мое предыдущее сообщение)? ![]()
Также я не совсем понимаю разницу между этими двумя методами (?):
Кажется, что rebake устанавливает аргументы по умолчанию в false, а rebake! — в true.
Как они связаны между собой (я, кстати, знаю о назначении символа ! в Ruby), и почему они находятся в разных файлах?
Моя цель — только понять, почему мои внешние изображения иногда загружаются, а иногда нет, и можно ли найти надежный способ загружать их правильно и автоматически, даже если это означает загрузку одного изображения в час. ![]()
Я занимаюсь этим почти две недели, и это сводит меня (и людей, для которых я мигрировал их сервер) с ума. ![]()
Кроме того, в логах Discourse нет ничего, кроме множества сообщений Sidekiq is consuming too much memory (using: 592.25M). Обратите внимание, что я работаю на Ubuntu через WSL в Windows 10, но намерен использовать рабочее решение (если найду его…) на нашем VPS.