web-dev-qa-db-ja.com

高度なフォーラムモジュールが提供するビューを、ビューが一貫して断続的に見つけられない原因は何ですか?

高度なフォーラムモジュールから頻繁に断続的なエラーが発生し、500のエラーが発生すると(WSOD)発生します。本番環境では、1時間あたり約20回、フォーラムページの読み込みの2〜3%が1時間あたりに発生します。 一貫して断続的です。ローカルでは、一貫してエラーを再現することはできませんが、発生します。

エラーはオンです

232行目:sites/all/modules/contrib/advanced_forum/includes/core-overrides.inc`:

未定義のメソッドstdClass :: preview()の呼び出し

問題は、advanced_forum_get_topics()関数にあります。

_function advanced_forum_get_topics($tid, $sortby, $forum_per_page, $sort_form = TRUE) {
  $term = taxonomy_term_load($tid);
  drupal_add_feed('taxonomy/term/' . $tid . '/feed', 'RSS - ' . check_plain($term->name));

  // Views handles this page
  $view = views_get_view('advanced_forum_topic_list');
  $view->sort_form = $sort_form;

  return $view->preview('default', array($tid));

}
_

基本的に、views_get_view()はビューを見つけることができず、オブジェクトは期待どおりに戻り行に作成されません。したがって、問題はビューが存在することを時々認識していないことにあるようです。これはフックの問題だと思います。

奇妙になり始めるのは、hook_views_default_views()とhook_views_plugins()の実装です。 views.api.phpによると、hook_views_default_views()はMODULENAME.views_default.incというファイルにあり、hook_views_plugins()はMODULENAME.views.incというファイルにあるはずです。ただし、どちらのファイルもMODULENAME.views.incファイルにあります。

Views.api.phpから:

  • hook_views_plugins()
    このフックはMODULENAME.views.incに配置する必要があり、自動ロードされます。
    MODULENAME.views.incは、MODULENAME_views_api()によって返される「パス」キーで指定されたディレクトリ、または「パス」が指定されていない場合は.moduleファイルと同じディレクトリにある必要があります。

  • hook_views_default_views()
    このフックはMODULENAME.views_default.incに配置する必要があり、自動ロードされます。 MODULENAME.views_default.incは、MODULENAME_views_api()によって返される「パス」キーで指定されたディレクトリ、または「パス」が指定されていない場合は.moduleファイルと同じディレクトリにある必要があります。

これらのルーチンを一見正しいファイルに分割してみました。これにより、Viewsは(Views GUIリストに表示されたように)常に高度なフォーラムビューを見つけましたが、プラグインは表示しませんでした。アドバンスフォーラムのページは問題なく実行されましたが、ビューが表示されなくなったアドバンストフォーラムが提供するスタイルプラグインを参照していたため、ビューは空白でした。

ビューのフックについて何か不足していると思いますが、私は完全に困惑しています。

  • スタック:Drupal 7、ビュー(7.x-3.3)、CTools(7.x-1.0)、高度なフォーラム(7.x-2.0)
  • PHP FPM、APC、nginx、Redis
  • 私はこれで何も役に立たなかった d.o issue

UPDATE 1:根本的な原因は解決していませんが、Redisを無効にしてDrupalのデフォルトのデータベースベースのキャッシュストレージメカニズムに戻すと問題が停止するようです発生から。

UPDATE 2:Redisでflushallを実行することで、ローカルで問題を確実に再現できます。フォーラムのリストを見る最初のページのロードは致命的になります。 2番目のページの読み込み(およびそれ以降のすべて)は正常に動作します。更新:私はエラーをクリアするために管理者のビューのリストページにアクセスする必要があります。

更新3:さらにトラブルシューティングを行うと、問題は、Redisを使用している場合にのみ、キャッシュのクリア後にビューのキャッシュが正しく再構築されないことが原因であるようです。標準のDrupalキャッシュに戻す場合、この問題は発生しません。問題が発生すると、ビューに2つから4つのキャッシュエントリしか存在しません。キャッシュが適切に構築されている場合は100以上です。管理ビューにアクセスするリストページを使用すると、キャッシュが完全に構築され、問題は発生しません。問題の原因となっているビュービューページをヒットしたのか、それとも高度なフォーラムビューをヒットしたのかを確認する必要があります。

UPDATE 4:IRCの有用なユーザーが、これがビューのキャッシュ競合状態の問題に関連する問題である可能性を示唆しています: 8538641102252

15
Justin

IRCから正しい答えを見つけたようです。私の経験で「一貫して断続的」とは、キャッシュを埋める2つのソースがある場合です。最も一般的なのは、開発サイトとステージング/本番サイトが異なるコードベースで同じデータベースにある場合です。データベースに接続するためのコードを読み取ったdrupal提供のキャッシュは、キャッシュされるルーティング/機能情報が相互汚染するためです。 admin/modulesページをクリックすると、モジュールのキャッシュと場所が更新されます。admin/ viewsリストページをクリックすると、競合しているものの観点ではなく、サイトの観点からサイトのビューの理解が更新されるため、エラーがクリアされます。

サーバー管理者の権限がある場合は、パスワードをサイトのデータベースに変更し、settings.phpのパスワードを変更して、何が壊れているかを確認してください。リスティングの破損が止まり、改ざんされているものが壊れるはずです。サイトに直接接続されており、settings.phpファイルを使用している場合を除きます。

また、docrootにビューモジュールが複数インストールされていないことを確認してください。

1
DeveloperWeeks