web-dev-qa-db-ja.com

「cronの実行が時間制限を超えました」のデバッグに役立ちます

カスタムモジュールを記述しました(Drupal 7およびPHP 5.3)で、hook_nodeapi()を使用し、特定のオブジェクトへのアクセスを許可しない)ノードタイプを入力し、警告メッセージとともにメインのリストページに(drupal_goto()を使用して)リダイレクトするだけです。

しかし、Boostモジュール(「メッセージのあるページをキャッシュしない」が有効になっている)がこれらのコンテンツタイプに到達し、リダイレクトされ続けるとcronでチョークが実行される疑いがあります。 cronの実行時に数ページをキャッシュしますか?)。

私が疑っている理由、そして実際の問題は、一定回数の実行後にcronが失敗し、「Cronの実行が時間制限を超えたため中止されました」というエラーメッセージが表示され、Watchdogでこのメッセージの直後に次のメッセージ、「このページにはDrupalメッセージがあり、ブーストがキャッシュされないようにしています。」

Module.inc(ハックされたコア here )にデバッグコードを配置して、この障害の原因となったモジュールを確認しました。cronが失敗するたびに、Cronにアクセスした最後のモジュールが表示されます。 「検索」(コア)モジュールになる:

ブースト22/02/2012-9:00 am Drupalこのメッセージは...匿名です
cron 22/02/2012-9:00 am cronの実行が時間制限を超えたため中止されました。匿名の
cron 22/02/2012-9:00 am検索検索cron匿名
cron 22/02/2012-9:00 amヒットノードcron匿名
cron 22/02/2012-9:00 amヒットフィルターcron匿名
cron 22/02/2012-9:00 am dblog cron匿名
ブースト22/02/2012-9:00 am静的ページキャッシュからの期限切れの古いファイル。匿名の
cron 22/02/2012-9:00 am hit boost cron匿名

その後、インデックスに登録するページ数を減らしましたが、効果がありませんでした。検索cronの後に実行されるcronは「システム」cronですが、このcronが正確に何をするのか私にはわかりません。

迷惑なのは、ブラウザーに入力してcronページにアクセスするとき http://address/cron.php またはコマンドラインwget http://address/cron.phpを使用して、正常に実行されます。しかし、システムのcronジョブからは、いくつかの成功したcronの実行後に、最終的にこの問題が発生します。

私はこの問題の根底に到達するための助けや正しい方向へのプッシュに感謝します。ありがとう。

/**
 * Implements hook_nodeapi().
 */
function rhask_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      if($node->type == 'question' && arg(0) == 'node' && !user_access('administer questions')){
        drupal_set_message('Access Denied - You cannot access this content directly. Please use this page.', 'warning');
        drupal_goto('ask');
      }
      break;
  }
}

メッセージを設定せずにリダイレクトできると思います。実際にBoostがcronで問題を引き起こしている場合は、それで解決する可能性があります。結果が得られたら、この投稿を編集します。


編集:cronは昨日から30分ごとに正常に実行されており、私がXMLSitemapモジュールの設定に加えた変更で問題が解決したようです。今後数日間、このウェブサイトを監視し続けます。

Edit2:Cronはまだ失敗します。 drupal_set_messageを削除したので、メッセージを設定せずにリダイレクトします。ただし、cronの失敗を防ぐことはできません。 Boostは文句を言うことなく、「静的ページキャッシュから失効した古いファイル」というログを記録するだけです。ここからこの問題を特定する方法を知りません。

1
Beebee

これを解決しました。 drupal_gotoがhook_exitを呼び出すと、cronの実行が失敗していました。 _$a4_の変数_hook_nodeapi_がNULLでない場合(これはnode_view()から呼び出され、cronからではないことを意味します)をチェックしてこれを停止し、次に進みます。 _drupal_goto_

0
Beebee

arg(0) == "node"is_numeric(arg(1))がcronではなくノード表示の内部パスを検出することを確認できると思います。また、arg(2)で「編集」やその他いくつかのノードを確認する必要があります。これらは、ノードのローカルタスクとして表示される場合と表示されない場合があります。

0
mpdonadio