form_open()
ベンチマーク関数の出力がキャッシュされないのと同様に、それを処理しないことに少し驚いています。
考えられる回避策は 2 つあります。
キャッシュドライバーを使用する (!= output->cache())
完全にレンダリングされたページをキャッシュする出力クラス キャッシュを使用する代わりに、キャッシュ ドライバのキー値キャッシュを使用して、ページのレンダリングされた部分を保存できます。
この問題のある CSRF トークンを含むフォームが複雑で、外部データ ソースからの多くの動的コンテンツが含まれている場合は、それらのデータベース結果をキャッシュし (キャッシュ ドライバーを使用するか、データベース結果キャッシュを有効にして)、キャッシュされた値を動的フォームにフィードします。
マニュアルからのファイルベースのキャッシュに関する警告:
出力クラスからのキャッシュとは異なり、ドライバーのファイルベースのキャッシュでは、ビュー ファイルの一部をキャッシュできます。これを慎重に使用し、アプリケーションのベンチマークを行ってください。ディスク I/O がキャッシングによるプラスの利益を無効にするポイントが来る可能性があるためです。
もちろん、memcached または APC にアクセスできる場合は、代わりにそれを使用してください。
そのページとプロファイルの出力キャッシュを無効にします。
出力キャッシュ (完全にレンダリングされたページ) をインターセプトし、CSRF トークン値を置き換える
CSRFトークンを使用したフォームのキャッシングに関する興味深いソリューションに出会いました(Symfonyで)。原作者を言い換えると:
- キャッシュされた応答を設定する前に、CSRF トークンを見つけて置き換えます。
- レスポンスとともにトークンの位置を保存します (これもキャッシュされます)。
- キャッシュから応答を返す前に、新しい CSRF トークンを注入します。
CodeIgniter では、キャッシュをインターセプトするにはhook-pointを使用する必要があるようですが、あなたの場合は. CodeIgniter がインスピレーションを得るためにCRSFトークンを実装する方法については、この優れた記事をご覧ください。ただし、実装するのは簡単ではないと思います。pre_system
cache_override
そのページをキャッシュせず、心配しないでください
これは明らかに最も簡単な解決策です。試して。ページの複雑さによっては、そのページのサブセットをキャッシュしないことによるパフォーマンスへの悪影響は、上記の 2 つのソリューションのいずれかを実装することの苦痛をはるかに上回る可能性があります。(ビューやコントローラーがどのように見えるかがわからないため、これがあなたの場合に受け入れられる解決策であるかどうかはすぐにはわかりません)。それがSPA の分離されたログインフォームである場合、おそらくそれを回避できます。