ファイルの総量が多いコースのバックアップがタイムアウトする場合に関する話題から派生しました.
http://moodle.org/mod/forum/discuss.php?d=114838#p505940
Windowsをサーバとして用いている場合に限定した話題ですが,Linuxをお使いの方からはアドバイスを頂けると助かります.私は主にWindowsを利用していますので,間違ったことを書く可能性があります.
Moodleは標準ではPHP言語で記述されたZIP書庫作成用のライブラリ(pclzip)を用いて複数のファイル(フォルダを含む)を一つのZIP書庫に格納および圧縮します.もしコースのバックアップ(ファイルの圧縮)に時間が掛かり過ぎるとPHPのスクリプトに対するタイムアウトが発生して処理を中断し,そのコース定期バックアップが”未完”となります.
この問題を解決するには,
- コースファイルの数と量を減らす
- タイムアウトの制限値(max_execution_time)を延ばす
- サーバの性能を上げる
に加え,pclzipライブラリではなく外部ZIPコマンドを利用するという選択肢があります.PHPのタイムアウトはスクリプトのバグ(無限ループなど)に対する防衛措置であるため,外部コマンドの実行に要する時間計測は行なわないため,外部コマンドで圧縮を行なう処理に時間が掛かってもエラーにならないためです.
外部zip(unzip)コマンドをMoodle上で使用するには,[サイト管理]-[サーバ]-[システムパス]の”zipのパス”(と必要ならば”unzipのパス”)を入力します.この設定が行われている場合,lib/moodlelib.phpのfunction zip_files()関数はpclzipライブラリではなく外部コマンドを利用します.なお,[システムパス]のページでは,”(Unix/Linuxのみ,任意)”とコメントがありますが,Windowsでも設定は可能ですし,そのためのコードもfunction zip_files()には記述されています.これはLinuxの場合は標準でZIPl書庫を作成するコマンドラインのコマンドがインストールされている場合が多いのに対して,Windowsは標準では搭載されていないためでしょう.
では,WindowsでコマンドラインによりZIP書庫を作成するには?
多くのWindowsユーザはアーカイバと呼ばれるプログラム等を用いてグラフィカルなインタフェース上で複数のファイルやフォルダを一つのZIP書庫に変換,あるいは展開していると思います.私もそうです(ExpLzhを使用).MS-DOSを使ったことのある方ならば,LHAやPKARCなどの名前を憶えていると思います.LHA.EXEはいまでも使うのですが,PKWare関係はほとんど使わなかったので記憶が曖昧です.
ともかくWindows上で外部の圧縮/展開プログラムを利用するには何かをインストールする必要があります.gzipというものもWindows版がありますが,これは単一のファイルを圧縮するものですので,複数のファイルを束ねて圧縮するにはTARというプログラムと組み合わせる必要(tar.gz)があります.これではありません.zip(Win32版)を用います.Moodleの管理者用ドキュメントを参照したところ,どうやら以下のものを用いると良いようです.
ZIP for Windows : http://gnuwin32.sourceforge.net/packages/zip.htm
以下,実際に作業(試行錯誤)を行ないながら途中経過を記録していきます.間違ったことを記述している可能性もありますので,「成功した」と私が書くまではお手元で試すのは自己責任でお願いします.
- オプションはLinux版と同じか?
- 日本語ファイル名やフォルダ名を圧縮対象のファイル名として利用できるか?
- 日本語ファイル名をZIP書庫名として用いることができるか?
- 大きなZIP書庫を作成できるか?(2GBを越える)
この辺りが調査対象です.申し訳ありませんが,標準のMoodleパッケージではなく,fs_moodle(日本語Windowsにも対応した白井オリジナルのパッケージ)での実験結果のみです.また,Moodleのバージョンは1.9.3+です.