web-dev-qa-db-ja.com

悪いPHP search_cronを失敗させるノードを見つける方法?

手動または自動でcronを実行できません。私は Cronデバッグモジュール をインストールし、すべてのモジュールをチェックしましたが、検索モジュールによってcronが動かなくなることがわかりました。無効にすると、cronが動作します。

私のノードの1つに悪いPHPコードが含まれているのが理由だと思います。「search_cronエラー」を探して、解決策を見つけました Drupal.org 試しましたnode.moduleを編集してそれを作成しましたが、次のエラーが発生しました:

致命的なエラー:2616行目の/home/mysite/public_html/modules/node/node.moduleにある未定義の関数db_fetch_object()の呼び出し

エラーのあるPHPコードをノードで見つける方法に関する解決策を提案できますか?私はDrupal 7.12を使用しています。

5
trante

大きなアプリケーションを6から7にアップグレードした後、この問題に直面していました。これは私がやったことです。データベースからこのクエリを実行します

SELECT n.nid FROM node n LEFT JOIN search_dataset d ON d.type = 'node' AND d.sid = 
n.nid WHERE   
d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid asc

これにより、問題が発生し、インデックスの再作成が拒否された最後のノードが得られます。そこから、そのノードでやりたいことができます。私の場合、コンテンツタイプ全体がうまく表示されないことに気付きました。このコンテンツタイプを表示するには、フィールドの1つを保存し直す必要がありました。

5
youngpac

関数db_fetch_object()はDrupal 7には存在しません。新しいデータベースAPIに置き換えられました。チェックアウト 動的クエリ、範囲、制限 または詳細 静的クエリ

この特定のケースでは、ほとんど同じ量のコードを書く必要はありません。スレッドが編集を提案するこの関数node_update_index()は、Drupal 7。

_function node_update_index() {
   $limit = (int)variable_get('search_cron_limit', 100);

   $result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit, array(), array('target' => 'slave'));

   foreach ($result as $node) {
     _node_index_node($node);
   }
}
_

そのスレッドによると、ノードのインデックスが付けられているときにノードのnidを保存するだけで、問題の原因となっているノードを特定できます。そのためには、foreachループでwatchdog()への呼び出しを追加するだけです。

_function node_update_index() {
   $limit = (int)variable_get('search_cron_limit', 100);

   $result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit, array(), array('target' => 'slave'));

   foreach ($result as $node) {
     watchdog('cron', "about to index node " . $node->nid);   /// ADD THIS TO DEBUG
     _node_index_node($node);
   }
}
_
2
Chaulky

Watch Dog行を追加するとうまくいきました。

ただし、アクティブなライブシステムで作業している場合:

2つのターミナルを開いた状態でdrushを使用して、次のコマンドを実行することをお勧めします。

1)drush search-index 2)drush watchdog-show

0
Patrick

ビューページの作成、タイトルフィールドの追加、field_body、公開されたフィルターボディの追加-オプション「含む」、保存してページを開き、不正な文字列を見つけようとしますdb_fetch_object、それを削除するか修正します

0
svetlio