活動完了日時がcron実行日時に書き換えられてしまう

活動完了日時がcron実行日時に書き換えられてしまう

- Takayoshi Kawate の投稿
返信数: 3

お世話になります。社内プロジェクトのオンライン教育システムとしてMoodle2を運用・管理しています。

各種活動完了でコース完了という条件を設定していて,cronが実行されるとコース完了にフラグが立つのですが,コース完了日時や活動完了日時がcron実行日時に書き換わってしまうのですが,これは仕様でしょうか?(cron実行で一度完了日時が書き換えられるとその後の実行では書き換えられず)

Moodleのレポート画面では完了日時は分かりませんが,レポートをCSV出力してみると活動完了日時がcron実行日時に全部書き換えられてしまい,教育記録として全く使えないものになってしまい困っています。(サーバの管理権限・負荷,セキュリティポリシー等の都合でcronをサーバで頻繁に自動実行させられず,ブラウザから手動でcronを実行せざるを得ない)

cronに書き換えられた活動完了日時を実際の完了日時に戻す方法はありませんでしょうか?(自動バックアップの設定になっていなかったためコースバックアップもない状態です・・・)

 Windows Server 2008 R2

 Moodle 2.8.5+ (Build: 20150417),MySQL 5.6,PHP 5.6 


Takayoshi Kawate への返信

Re: 活動完了日時がcron実行日時に書き換えられてしまう

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> コース完了日時や活動完了日時がcron実行日時に書き換わってしまうのですが,これは仕様でしょうか?

活動完了に関しましては必ずしもcronの実行により完了日時が書き換えられるということではないと思います。例えばフォーラムへの1件の記事の投稿を完了条件にした場合、cronを停止していたとしても、ユーザがフォーラムに記事を投稿したタイミングを活動完了日時として完了マークされます。

参考資料:
[Moodle in English: Delay when updating activity completion]
https://moodle.org/mod/forum/discuss.php?d=313163#p1253853

コース完了日時に関しましてはcron実行時にPHPの関数「time()」を使って取得したUnixタイムスタンプを基にcompletion/cron.phpの374行目あたりで下記のように更新されているようです。

    // Mark all users as aggregated
    $sql = "
        UPDATE
            {course_completions}
        SET
            reaggregate = 0
        WHERE
            reaggregate < :timestarted
        AND reaggregate > 0
    ";

    $DB->execute($sql, array('timestarted' => $timestarted));

> cronに書き換えられた活動完了日時を実際の完了日時に戻す方法はありませんでしょうか?

もしかしたら、cronを実行する前は活動完了日時には完了日時等の値が設定されていない状態だったのではないでしょうか。

活動モジュールごとに最終更新日時を記録していると思いますので、作業量は別にして、その日時を使って活動完了日時を更新することは不可能ではないと思います。

Mitsuhiro Yoshida への返信

Re: 活動完了日時がcron実行日時に書き換えられてしまう

- Takayoshi Kawate の投稿

回答ありがとうございます。


実際にDBの中身までを見たわけではないのですが,たとえば活動AとBの2つの活動の完了をもってコース完了とすると,受講者が活動A・Bが完了させるとその日時が記録されます。これはcron実行前に,完了レポートのCSVをダウンロードするとその日時が記録されていることで確認しています。CSVにはたとえば

 活動A,3月10日 9時,活動B,3月10日 10時,コース,""

といった感じで日時が記録されています。


次に,仮に「3月11日12時」にcronを実行して,もう一度完了レポートのCSVをダウンロードすると

 活動A,3月11日 12時,活動B,3月11日 12時,コース,3月11日 12時

となっているのです。


出力されたレポートだけの問題で,DBには正しい日時が記録されているのであればいいのですが,DBもそうなっている場合,ログには各ユーザが完了させた日時が記録されているのでこれをもとに直せそうではありますが,ユーザ数の多さやDBを直接いじらざるを得ない点などを考慮するとハードルは高そうです。



Takayoshi Kawate への返信

Re: 活動完了日時がcron実行日時に書き換えられてしまう

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

確認しましたところ、「フォーラム」モジュールの場合、下記のようにcron実行前には日時は記録されないようです。

------------------------------------------------------------------------------------------------------------
[ cron実行前 ]
ID,名称,メールアドレス,フォーラム001,"フォーラム001 - 完了データ",フォーラム002,"フォーラム002 - 完了データ",コース完了
4,"user002 user002",user002@moodle_test.com,完了,"17年 03月 11日 04:00",完了,"17年 03月 11日 04:00","17年 03月 11日 04:00"
5,"user003 user003",user003@moodle_test.com,完了,"17年 03月 11日 04:00",未完了,,
6,"user004 user004",user004@moodle_test.com,未完了,,未完了,,
7,"user005 user005",user005@moodle_test.com,完了,,未完了,,

[ cron実行後 ]
ID,名称,メールアドレス,フォーラム001,"フォーラム001 - 完了データ",フォーラム002,"フォーラム002 - 完了データ",コース完了
4,"user002 user002",user002@moodle_test.com,完了,"17年 03月 11日 04:00",完了,"17年 03月 11日 04:00","17年 03月 11日 04:00"
5,"user003 user003",user003@moodle_test.com,完了,"17年 03月 11日 04:00",未完了,,
6,"user004 user004",user004@moodle_test.com,未完了,,未完了,,
7,"user005 user005",user005@moodle_test.com,完了,"17年 03月 11日 05:49",未完了,,
------------------------------------------------------------------------------------------------------------

テーブル「mdl_course_completion_crit_compl」のカラム「timecompleted」が同一日時で更新されていまう現象に関しましては確認できました (添付画像: course_completion.png)。

> ユーザ数の多さやDBを直接いじらざるを得ない点などを考慮するとハードルは高そうです。

そう思います。活動モジュールのテーブルおよび下記2つのテーブルを組み合わせたなSQL文を書く必要があるのではと思います。

mdl_course_completion_crit_compl
mdl_course_completion_criteria

添付 course_completion.png