OSCのCraftCMSの話題をかける適切なブログが社に無くてここに書くやつ。昨晩から今日午前中にかけて、一部コンテンツが表示されなくなっていました。現在は復旧済みです。お騒がせしました。
更新が重い
OSCのタイムテーブル機能をCraftCMSで実装できたので、その回収内容の説明を事務局にしていたところ、最後に質問で、この件とは関係なく、最近各開催のトップページを更新すると、遅くてタイムアウトになるとのこと。実際に見るとタイム・アウトしてリバースプロキシ元が504を返すし、保存に時間がかかるどころか保存中はサイトも応答していませんでした。やばい。
調べてみたところ、重くなるからざっくり100サイトくらいまでね、という見解がでてきました。OSCのCraftCMSは現在72サイトありました。まずい、これやん。
そもそもマルチサイト運用できるとは言え、マルチサイト的に使う項目名が「翻訳」になっている時点で、サイトの多言語化のためのマルチサイト機能であることが推測できて、毎月12サイトくらいが確実にできるOSCのような運用はあまり適切ではない可能性もあります。
根本的には、1〜2年ごとに新規インストールして、リバースプロキシーで振り分けて、古い方は順次HTML化かな、という気がしています。ただ、現状の肥大化した分をどうするか、年ごとに切り替えをやるにはもう遅い感のあるいまのタイミングではどうすべきかは非常に悩ましいところです。
あと、各開催ではなく、ドメインの大元になっているコンテンツもあるので、これも分離するかとなると、管理ページがたくさんできることになるので、考えることは多そうな感じです。ふーむ。
暫定対処
とは言えすぐに手を打てるわけでもないので、小手先で対処することにしました。幸い、該当のセクションで「このセクションのエントリのバージョン管理を有効にする」を無効化すれば保存がタイムアウトしない範囲で終わることがわかったので、これを提案して実施しました。
ついでにやったやつがまずかった
各フィールドに居る「このフィールドの値を検索キーワードとして使用する」。これもほとんどのフィールドにチェックが付いていたのですが、これもなんか重くなりそうなイメージがありますし、実際検索に使っている項目もほとんどないはずなので、あらかたチェックを外しました。
どうもこの項目、OSCのサイトでちょっと前まで使っていたバージョン3.3の頃はデフォルトがオンだったらしく、3.5でデフォルトオフに変わったようでした。やはりパフォーマンスに影響するっぽいので、オフにできるものはしたほうが良さそうです。ちなみに、現在のOSCのサイトは3.9系の最新までアップデート済みですがPHPのバージョンの都合で、この次にするにはPHP8が必要で、つまりUbuntu20.04から、22.40もしくは24.04への移行が必要な状態です。やることがおおい!
で、ポチポチした翌日(今日)、事務局から、サイトが一部表示されないとのこと。ああー……これはチェックが必要なやつまでオフにしてしまった模様。テンプレートの中身から検索してそうなものは洗い出したつもりでしたが、勢いが余った模様。

もとに戻す手順
もとに戻すには、必要なところのチェックをつけ直すだけ……と思いきや、チェックしてももとに戻りませんでした。なんで!!
調べたらでてきました。検索インデックスの更新が必要なようでした。
72サイトの全エントリーに対して更新……各開催50エントリーあるとしたら3600エントリーの更新を……!?とはなりましたが、やるしかないのでやりました。
Githubにあったコマンドは、プライマリサイトの全エントリーに対して実行なので、各サイトとなると、それぞれでコマンド実行が必要になりました
$ php craft resave/entries --update-search-index
サイトの指定は「--site <サイト名>」オプションで指定できて、また、セクションも「--section <セクションのハンドル>」で指定できたので、これを駆使してぶん回していきます。
ループを作成するにあたり、各サイトの一覧を出すコマンドはなかったので、Twigテンプレートをサイト内に仮置きしてリストを出力しましたが、面倒なので実行コマンドごと出力してもらいました。
参考: templating - Loop through all sites in multisite installation - Craft CMS Stack Exchange
{% set sites = craft.app.sites.getAllSites() %}
<pre>
{# 見られる可能性の高い新しいサイトから順にやることにした #}
{% for site in sites|reverse %}
echo [{{ site }}]
php craft resave/entries --update-search-index --site {{ site.handle }} --section oscEntry
{% endfor %}
</pre>
で、それをシェルスクリプトとして用意して実行して放置。
$ bash 20250410-resave-all-sites-with-update-search-index.sh
しばらくして、見えなくなっていた項目が見えるようになったことを確認できました。
ふう……
実行の前に、改めて検索に使用している項目をチェックしていましたが、実行でやれやれと思いながら各ページを回ったところ、別のところでもコンテンツが見えなくなっている==チェックし忘れた項目の存在に気づき、もう一度スクリプトを回す羽目にあいました。ふう……。