去年納品済みのお客さんから特定のページでエラーが出るとの連絡を受け、内容を確認したところ、以下のようなエラーメッセージが。
去年アップデートしてそのまま運用していたので、バージョンは5.6.2.1。
Warning: file_put_contents(/home/files/cache/pages/m/a/n/manual%2F%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4%25E4.cache) [function.file-put-contents]: failed to open stream: File name too long in /home/updates/concrete5.6.2.1.ja/concrete/core/libraries/page_cache/types/file.php on line 67
File name too long in
と書かれていたので、まぁファイル名が長いんでしょうなぁと思いつつも対策を探したけどイマイチよくわからなかったので素直にコンクリートファイブジャパンの佐々木さんに聞きました。
日本語URLの長さとキャッシュ
日本語でページURLが、ページキャッシュとして保存される際にURLエンコードされて上記の様なとんでもなく長いURLになってしまう為、エラーが表示されるという事だった。
対策
主な対策方法は4つ。
1.ページキャッシュをしない
日本語URLから作成されてバカみたいに長くなるキャッシュファイル名が問題なら元を断つ。
キャッシュを使用しなければ、エラーは出ない!(キリッ
2.日本語URLを使用しない
バカみたいに長くなるキャッシュファイル名が作成される元が、日本語のURLならそもそも日本語を使用しなければいいのでは。
3.エラーを表示しない
管理画面のデバッグ設定で、「来訪者からエラーを隠します。」にチェックをするとエラーが非表示になります。
うーん。根本的な解決にはならないかな…?
4.file.phpを書き換える
ページキャッシュを取っている記述をページIDにすれば解決と教えていただきました。
/concrete/core/libraries/page_cache/types/file.php 56行目〜70行目
public function set(Page $c, $content) { if (!is_dir(DIR_FILES_PAGE_CACHE)) { @mkdir(DIR_FILES_PAGE_CACHE); @touch(DIR_FILES_PAGE_CACHE . '/index.html'); } $lifetime = $c->getCollectionFullPageCachingLifetimeValue();//←多分この辺を変えればいいのでは(無責任) $file = $this->getCacheFile($c);//←多分この辺を変えればいいのでは(無責任) if ($file) { $response = new PageCacheRecord($c, $content, $lifetime); if ($content) { file_put_contents($file, serialize($response)); } } }
たぶん。というのも、coreの中をいじるのは怖くて実際にやってないので未検証なのです。
プログラムの知識が無くても簡単に使えるconcrete5ですが、こういう細かい部分になるとwordpressや他のオープンソースのツールに比べて参照元が少ないのが現状ですね…。