再構築時に発生するエラー「Reading from filehandle failed at」の原因は何ですか?
エラー「Reading from filehandle failed at」の原因はテンプレートのアーカイブマッピングの設定にあります。
アーカイブマッピングではテンプレートタグを利用することができますが、そこで条件分岐のタグを使って例外の分岐がない記述を行うとこのエラーが発生する場合があります。
原因 (問題が発生するアーカイブマッピングの記述例)
次のテンプレートはエラーが発生するアーカイブマッピングの記述の一例です。
<MTIf tag="EntryPrimaryCategory"><$MTEntryID$>.html</MTIf>
この記述では条件分岐が偽判定になるとアーカイブマッピングの設定が空と同等になり、掲題のエラーが発生します。
対策 (問題が発生しないアーカイブマッピングの記述例)
このような記述を行われている場合、アーカイブマッピングの設定が空にならないよう例外の分岐を設けることでエラーは発生しなくなります。
<MTIf tag="EntryPrimaryCategory"><$MTEntryID$>.html<MTElse>.dummy</MTIf>
その他の原因と対策
- サーバー上に出力ファイルと同名のディレクトリが存在する
- サーバー上にディレクトリと同名のファイルが存在する
例えば次のパスでファイルを出力する場合に、サーバー上に 2021 ファイルが存在すると同じ階層に 2021 ディレクトリを作成できず、掲題のエラーが発生します。
2021/index.html
同様に 2022 ディレクトリの中に index.html という名前のディレクトリが存在する場合、2022 ディレクトリ内に index.html ファイルを作成できずエラーが発生します。
2022/index.html
このようなケースではファイルとディレクリの名前が衝突しないようにファイルもしくはディレクトリを削除したり、アーカイブマッピングなど出力するファイルのパスを変更してください。
対策を行う場合の注意点
この問題の対策のためにアーカイブマッピングを修正する場合、例外の分岐を追加することでサーバーにファイルが出力されるようになり、また、テンプレートタグが出力する URL が変化します。アーカイブマッピングを修正される場合はサイトの設計をよく理解した上でアーカイブマッピングと一緒に修正、対策を行ってください。
原因の記述があるが問題が起きていない場合
このエラーは不定期に発生するため、原因となるアーカイブマッピングと同様の設定を行っていてもエラーが発生しない場合もあります。
またエラーが発生しない場合もファイルが更新されてないなど気づけないかたちで問題が起きているケースもあります。 原因となる設定を行っている場合にはいつ問題が起きてもおかしくありませんので、アーカイブマッピング中で行う条件分岐には例外の分岐を必ず用意してください。