web-dev-qa-db-ja.com

私のhook_nodeapi関数がユーザーではなくcronによって呼び出されていることを確認するにはどうすればよいですか?

ノードに接続されたnode/cckフィールドの表示をフィルタリングしようとしているので、カスタムのhook_nodeapi関数を記述し、ユーザーに権限がない場合はフィールドの値を編集しています(編集)。問題は、cronが実行され、apachesolrが同じコンテンツのインデックスを作成しようとすると、cronに「権限」が関連付けられていないため、編集されたコンテンツのインデックスが作成されることです。

Cronによって関数が呼び出された場合にブール値を返す簡単なテストが必要です。何か案は?私はcronコード(Drupal 6)を調べ始めましたが、bootstrapはデフォルトの匿名ユーザーアカウントの詳細でcronを設定します...

4
Craig Moore

Cronはどのように実行されていますか?のようにcrontabを介して行われた場合

0 1 * * *   /usr/bin/wget -O - -q -t 1 http://my.site.com/cron.php

それから私はそれを疑っています

function hook_whatever () {
  global $user;

  if (strpos(request_uri(), "/cron.php") === 0 && $user->uid == 0) {
    // from crontab
  } else {
    // from somewhere else
  }
}

うまくいくでしょう。

管理ページの1つから手動で実行するのは難しいかもしれませんが、$user->uidその場合、チェックで十分です。

5
mpdonadio

問題は、それほど多くのcronではなく、apachsolr自体のインデックス作成である可能性があります。

コードを見る here いくつかのオプションがあるようです。

モジュールをapachesolrインデックスから除外します。 UIがどこにあるのかはわかりませんが、コンテンツがインデックスに登録されているときは具体的に呼び出せないようです。

または、op 'update index'をチェックするnodeapiフックにカスタムコードを配置することもできます。

または、nodeapi op = viewフックで$ node-> build_mode == NODE_BUILD_SEARCH_INDEXを確認できます。

問題が発生するのは、nodeapi op = loadに物事を入れている場合のみですが、op = viewを説明するのに適しています。

2
Jeremy French

Drupal 7の場合、以下のコードは、有効なcronキーが使用されているかどうかをcronが確認する方法です。cronが同時に実行されている場合、これが誤ったアクセス許可を与えるとは思わない$ _GET変数はそのスクリプトからのみアクセス可能なスーパーグローバルであるため、リクエストを送信します。間違っている場合は修正してください。

if (isset($_GET['cron_key']) && variable_get('cron_key', 'drupal') == $_GET['cron_key']) {
  //do my fancy cron stuff here
}
0
Jeremy John

関数がcron経由で実行されているかどうかは、 drupal_cron_run はあなたの中にあります debug_backtrace

これはひどい解決策なので、他の解決策が出てきたらそれをしないでください。

0
Oswald