提案:コースバックアップ処理時におけるサーバ側の負担低減の可能性
(ZIPファイルの一時フォルダからコースフォルダへの移動)
2GBを越えるバックアップファイルの作成に関する以下の2つの議論,
(1)http://moodle.org/mod/forum/discuss.php?d=114838
(2)http://moodle.org/mod/forum/discuss.php?d=115320
この(2)中でUmedaさんが提案したアイディア,copy()ではなくrename()で作業用一時フォルダからコース内のbackupフォルダへのzipファイルを移動する手法,は,実はとても重要な性能UPに繋がるテクニックなのではないかという気がしてきました.
コース内のさまざまなファイルをバックアップする作業は,まず安全のために対象となる全ファイルをmoodledata/temp/backupフォルダの下に作成したユニークな名前のフォルダにコピーされます.そしてこの一時フォルダ内でzipファイルを作成後,完成した一つのzipファイルのみをコースのbackupフォルダへコピーし,残りのファイルをユニークな名前のフォルダごと削除します.Moodle2.0は知りませんが,Moodle1.9まではこのような手順です.
それに対して実際のプログラムでは完成したzipファイルをbackup/backuplib.phpのfunction copy_zip_to_course_dir()を使ってコピーします.この関数から呼び出されるファイルコピーのための関数,backup_copy_file ($from_zip_file,$to_zip_file)はサブフォルダに対応した再帰的なファイルコピーを行なう関数ですが,先に述べたようにコピーするのはたった一つのzipファイルのみです.
(1)中で私が示した改造案は旧来の処理とほぼ等価です.
PHP標準のcopy()関数は2GBを越えるファイルを正常にコピーできません(integerを32bitとしてコンパイルした環境).つまりOSに処理を単純に丸投げしているのではなく,自身でファイルを読んで複写していると思われます.rename()関数で”移動”させる処理は20GBのファイルであっても正常に処理が完了することが確認されていることから,処理はそのままOSに丸投げされていると予想されます.本件は特に,”複写”後にオリジナルのzipファイルをフォルダごと削除してしまうことから,”複写”ではなく”移動”で問題ないはずです.OSにもよるかも知れませんが,一時フォルダとコースのフォルダが同じパーティション内にあるのであれば,リネームはファイルサイズによらず一瞬で終了するのではないでしょうか.
まだTrackerを検索して類似の提案が無いか調べていません.もしこの改良がMoodleの定期バックアップ処理のサーバ側の負担を大幅に低減できるものであるならばTrackerに報告しようと思います.皆様の御意見,お待ちしております.