バッチ処理の実現

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
Anonymous's picture

初めてお世話になります。こやんと申します。

2016/12/26 16:40 修正
申し訳ありません。
事情により、この質問を消さなくてはならなくなりました。

ご教示頂いた皆さん、これから同じようなことでつまずくであろう人たちには本当に申し訳ありませんが、削除いたしました。
本当に申し訳ありません。

調査結果や最終的にどういう方針で行くかなど、後日報告する予定でしたが、それもできそうにありません。オープンソースのコミュニティでこのような事になってしまい、本当に申し訳ありません。

Comments

kamihicouki's picture

簡単ですが回答します。Drupal8はよく知らないですが。。

ブロック後に一定時間経ったらユーザを抹消するためのバッチ処理を
作ることになりました。
今、設計側から言われている方針は以下です。
 ○一定間隔で抹消用のシェルスクリプトを起動
  ※具体的な事は分かりません。
   とりあえず、どこからかシェルスクリプトが
   キックされるということだけ分かっています。
 ○シェルスクリプトが抹消用のPHPプログラムを実行

ユーザをブロックするというのは、ユーザのステータスが"非アクティブ"になるということですか?
一定時間経過というのはユーザ情報の最終更新日時から判定できますね。
バッチ処理は Drupal(php?) 上の cron で賄えるかと...シェルスクリプトいらない気がします
- Drupal API の勉強せずにPHPだけで賄うのは良くないことだと思いますよ。むしろ経験則では害悪(保守性を犠牲にしてる)

alpha 版ではありますが、とりあえずRules | Drupal.org を使って、ユーザアカウントのキャンセルができるようになった方がよいかと。

p.s.
納期はいつですか?

ありがとうございました

koyan's picture

kamihicoukiさん

お返事ありがとうございました。
ご教示頂いたRulesというモジュールに関して調査し、いけそうだったら設計側や顧客に相談してみます。
後の方からいくつか対応案を頂きましたので、そちらも十分に検討致したいと思います。
取り急ぎお礼まで。

★2016/12/26 16:43 一部、記述を削除しました。★

私も kamihicouki さんと同じく Rules

hgoto's picture

私も kamihicouki さんと同じく Rules を使う方法をおすすめします。ただ Rules は(他のモジュールもそうですが)最初は学習コストがかかる & 慣れていないと想定外の動きをしたときの問題解決に骨が折れるので、スクリプトを使う方向である程度進まれているのであればそのままスクリプトを使われる形でもよいのかなと思います。

質問①

スクリプトでのアプローチ自体は特に間違っているということはないと思いますが、特定のクラスだけを読み込んで使うやり方は Drupal では原則あまりやらないものと思います。

バッチ処理を作るのによい方法のひとつは hook_cron() というフックを実装することです。ここで、「フックを実装」というのは、カスタムモジュールを書いてその中で関数名の先頭の hook の部分をモジュールのマシン名に置き換えた関数(モジュール名が mymodule で hook_cron() の場合は mymodule_cron() )関数を定義することです。

https://api.drupal.org/api/drupal/core%21core.api.php/function/hook_cron...

hook_cron() ではなくあくまでもスクリプトで処理をされたい場合は Drush コマンド( drush php-script )経由でそのスクリプトを呼び出すのがよいものと思います。

http://drupal.stackexchange.com/questions/9837/how-to-execute-php-script...
https://drushcommands.com/drush-8x/core/php-script/

drush php-script だと都度 require 等をする必要がなくクラスをそのまま使えます。

質問②

理屈としては、 User クラス等を正しく使えるようにするなら index.php 内の処理の流れを再現する必要があります。ただそれは大変な( & お作法がよくない)ので、上述のとおり Drush ( drush php-script )を使う形がよいと思います。

質問③

かんたんにではありますがご説明します(詳しくお知りになりたい場合は英語でググってみてください。同様の質問が見つかるものと思います)。

  • module はモジュールを作成したときにデフォルトで読み込まれる php ファイルです。
  • inc は Drupal の旧来の php ファイル用の拡張子で module 以外の php ファイルを格納します。手続き型の関数が主に格納されています。
  • php はクラスやインタフェース、トレイトを定義しているファイル、でしょうか(ファイル名 = クラス名)。クラスオートローディングの対象です。

ご参考になればと思います。

ありがとうございました

koyan's picture

hgotoさん

お返事ありがとうございます。
Drupalの情報収集をする上で、Studio UmiさんのWebサイトには大変お世話になっています。

方針として、以下3点ご教示頂いたと認識しております。
調査および比較検討を行いまして、設計の方に相談したいと思います。
 ・上のkamihicoukiさんと同じく「Rules」というモジュール
 ・カスタムモジュールを作ってhook_cron()というフックを実装する
 ・Drush コマンド(drush php-script)経由でそのスクリプトを呼び出す

質問②に関して:
自分がやろうとしていた方針は良くないけど、PHP的には必要ということで理解しておきます。

質問③に関して:
以下の件に関して、もう少し調べてみます。
 ・拡張子moduleがデフォルトで読み込まれるという件
 ・拡張子phpがクラスオートローディングの対象である件に

取り急ぎお礼まで。

★2016/12/26 16:44 一部、記述を削除しました。★

blauerberg's picture

色々な方法で実現はできますが、シェルスクリプトから任意のタイミングで呼ばれることが決まっているのであれば、
hgoto さんが紹介してくれた drush php-script がフィットするかと思います (私もよく使います)。

理屈としては、 User クラス等を正しく使えるようにするなら index.php 内の処理の流れを再現する必要があります。

もうちょっと細かい話をすると、全てのDrupalのクラスやメソッドを使いたい場合は、Bootstrap と呼ばれるDrupalの機能を使うための初期処理を行う必要があります。

drush php-script を使うとこの Bootstrap の部分は勝手にやってくれるので楽ができます。
上のリンクのようにベタに書くこともできますが、Drupalのバージョンが変わった時にそのままで動くとは限りませんので、直接書くにはオススメしません。

ちなみに、Drupal 8のRulesモジュールはまだ alpha ですので、 might include security issues です。
セキュリティの要件が厳しいところで使う場合は自己責任で (厳しところなら私は使いません、責任取れないので)。

https://www.drupal.org/docs/8/understanding-drupal-version-numbers/what-...

ありがとうございました

koyan's picture

blauerbergさん

お返事ありがとうございます。

方針として、
 ・drush php-script
 ・Rulesモジュール
をご教示頂きました。
調査および比較検討を行いまして、設計の方に相談したいと思います。

取り急ぎお礼まで。

★2016/12/26 16:45 一部、記述を削除しました。★

Tomotsugu Kaneko's picture

あるいはこういうのはいかがでしょう。
以下では任意のタイムスタンプを基準にユーザを抽出しdrush ucanに渡しています。これにユーザの状態を含めてdrush ucanに渡せばいいのではないかと考えました。

drush sqlq "SELECT GROUP_CONCAT(name) FROM users_field_data WHERE created >= 1481272884"| xargs drush ucan -y

twitter: @snize

ありがとうございました

koyan's picture

snizeさん

お返事ありがとうございました。
drush ucanに関する情報ありがとうございました。
これを糸口に、調査してみたいと思います。

取り急ぎお礼まで。

★2016/12/26 16:45 一部、記述を削除しました。★