Moodle環境の構築

奈良の案件は、短期でのプロト開発つまりガンガン書けることという要件があり、私のスキルでは無理という判断で流れた。eラーニングシステムを構築するための候補として、Moodle(ムードル)の利用が挙げられており、その環境を事前調査していた矢先であった。せっかくなので調査した情報をメモしておく。PHPは、今回初めて使ってみたが、結構完成度は高かった。

Moodle環境の環境は、以下で構成される。IISを選択した。
  ■ IIS 5.1 (推奨はApache 2.2.3)
  ■ PHP 5.2.5 (推奨はPHP 5.2.0)
  ■ MySQL 5.0.19 (推奨は5.0.27、最新は5.0.51)
  □ MySQL GUI Tools 5.0-r12
  ■ phpMyAdmin 2.11.4 (推奨はphpMyAdmin: 2.10.1)
  ■ Moodle 1.8.4 (推奨はMoodle 1.8.2以降)

これらのディレクトリ構成は以下のようになる。これをベースに環境構築の手順を整理しておく。

  c:/
    +-- Inetpub/
    |   +-- moodledata/
    |   +-- wwwroot/
    |       +-- moodle/
    |       |   +-- □install.php
    |       |   +-- □index.php
    |       |   +-- lang/
    |       |       +-- ja_utf8/        # うまく機能せず
    |       +-- phpMyAdmin/
    |       |   +-- ■config.inc.php        # 適宜作成
    |       +-- ■phpinfo.php               # 適宜作成
    |       +-- ■mysql-connect-test.php    # 適宜作成
    +-- mysql/
    |   +-- ■my.ini                        # 要編集
    |   +-- tools/                          # MySQL GUI Tools
    +-- php/
    |   +-- ext/
    |       +-- php_mysql.dll
    |       +-- php_mysqli.dll
    |       +-- php_pdo.dll
    |       +-- php_pdo_mysqli.dll
    +-- windows/
        +-- ■php.ini                       # 要編集
        +-- system32/
            +-- libmysql.dllなど

【1】MySQLMoodle用のDBを作成

Moodle用のDBを作成する

$ mysql -uroot mysql
> CREATE DATABASE moodle 
  DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,ALTER 
  ON moodle.* TO moodleuser@localhost IDENTIFIED BY 'moodleuser';
> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,
  CREATE TEMPORARY TABLES,DROP,INDEX,ALTER 
  ON moodle.* TO moodleuser@localhost IDENTIFIED BY 'moodleuser';
> flush privileges;

一応パスワードも設定しておく。Moodleは文字化けの問題が多いのでutf8_unicode_ciの設定を確実にしておく。作成したDB「moodle」はテーブルを空にしておく。
PHPからの接続確認用のテーブルも作成しておく。DB「test」などに作成する。

> use moodle;
> show tables;

# PHPからの接続確認用のテーブルを作成しておく
> use test;
> create table dummy (id int(5) default '0' 
  not null, name varchar(32) not null);
> insert into dummy (id,name) values (123, 'hachi');
> insert into dummy (id,name) values (45, 'nana');
> select * from dummy;
> exit;

【2】PHPを確認

PHPのインストール、IISへの設定は省略。その後、以下の1行のphpinfo.phpを作成し、c:\Inetpub\wwwrootに置く。

<?php phpinfo(); ?>

http://localhost/phpinfo.phpで確認する。

Trouble-1:Apacheサービスを停止させないとIISのサービスが開始されない状況になった。詳細は不明。Apacheサービスを停止後、World Wide Web Publishingを再起動すること。

【3】PHPからMySQLに接続確認

① C:\windows\php.iniを編集してMySQL対応部分のコメントを外しておくこと。利用するモジュールだけでよいが4つとも活かしておいてよい。

extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll

PEARライブラリのDBクラスもインストールする場合は、c:\php の go-pear.bat を実行し、コマンドライン

pear install DB
を実行する。PHPには、以前からのMySQL対応のmysql関数群と、改良版拡張サポートであるmysqli関数群がある。またDB接続の負荷を軽減させるためのラッパーがpdo関数群である。pdoは、MySQL,PostgreSQL,SQL Server,Sybase,DB2,Oracleなどの多くのデータベースに対応されている。
mysql-connect-test.phpを以下のように作成し、c:\Inetpub\wwwrootに置く。Host,User,Password,DBNameは適宜。php_mysqli.dllを利用しているが、php_mysql.dllでもよい。「i」を外す。

<?php

  $dbHost = "localhost";
  $dbUser = "root";
  $dbPass = "";
  $dbName = "test";

  $conn = mysqli_connect($dbHost, $dbUser, $dbPass);
  mysqli_query($conn,"set names sjis");
  mysqli_select_db($conn, $dbName) 
  or die("データベース" . $dbName . "への接続に失敗した");
  $sql = "select id,name from dummy";
  $result = mysqli_query($conn, $sql) 
  or die("データの読み込みに失敗した:\n " . mysqli_error($conn));

?>
<html>
<head><title>PHPとMySQLの接続確認</title></head>
<body>
  <font size= "+2">PHPからMySQLへの接続を確認するテスト</font><br/>
  <font color="blue">
  host = <?php print "$dbHost" ?><br/>
  user = <?php print "$dbUser" ?><br/>
  dbname = <?php print "$dbName" ?><br/>
  </font>
  <TABLE border="1" cellspacing=0 cellpadding=2 width="260">
    <TBODY>
        <TR bgcolor="#cccccc">
          <TH width="20"></TH>
          <TH width="80">id</TH>
          <TH width="160">name</TH>
        </TR>
        <?php
         $cnt = 0;
             while ($row = mysqli_fetch_array($result)){
               $cnt = $cnt + 1;
               print "<TR>";
               print "<TD width=\"20\">$cnt</TD>";
               print "<TD width=\"80\">$row[0]</TD>";
               print "<TD width=\"160\">$row[1]</TD>";
               print "</TR>";
             }
         ?>
    </TBODY>
  </TABLE>
</body>
</html>

http://localhost/mysql-connect-test.phpで確認する。

Trouble-1: 「Fatal error: Call to undefined function mysqli_connect() in xxx.php」が出た。php.iniのextension_dirの設定がおかしかった。

extension_dir = "c:/php/ext"
Trouble-2: 「Warning: mysqli_connect(): Host 'xxxx' is not allowed to connect to this MySQL server in xxx.php 」が出た。$dbHostの設定がおかしかった。以下のどれか。省略されるとphp.iniのmysql.default_hostやmysqli.default_hostに設定された値を参照にいく。

$dbHost = "localhost"
$dbHost = "127.0.0.1"
$dbHost = ""          # 省略するとphp.iniの値を参照

Trouble-3: 「データの読み込みに失敗しました: Incorrect information in file: '.\test\dummy.frm'」が出た。テーブルが壊れていたので、テーブルをdropし、あらためてcreate table、データのinsertを行った。むやみにMySQL Server Instance Config Wizardを繰り返したためかも。

【4】Moodleのインストール

http://docs.moodle.org/ からダウンロードしておく。ドキュメントは http://docs.moodle.org/ja/ から。ユーザー登録が必要。
② ダウンロードしたzipを展開して、c:\Inetpub\wwwroot\moodle に置く。
③ install.phpを起動する。http://localhost/moodle/install.php からインストーラを起動する。最初に言語選択のダイアログがあるが、「en」のままで進めるのが無難。「ja_utf8」では文字化けする。

Trouble-1:unicode is required to be installed/enabled. It is required that you store all your data in Unicode format (UTF-8). New installations must be performed into databases that have their default character set as Unicode. If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).」が出ると次に進めない。「xxx is recommended to be installed/enabled」のwarningレベルなら進めてよい。
http://download.moodle.org/lang16/ から ja_utf8.zip をダウンロードし、展開してmoodle/langディレクトリの中に入れる。moodle/langにはデフォルトではenとen-utf8しかない。
MySQLにテーブルを作成する時間が結構かかる。DB「moodle」には、mdl_xxxxというprefixのテーブルが185個生成されていた。
Moodleに教材作成のための環境を定義する。(これ以降の詳細はまだ未確認。文字化けにも対応できていない。)

【5】phpMyAdminの利用

PHPからMySQLを管理するツールの利用が推奨されている。http://www.phpmyadmin.net/home_page/downloads.php から phpMyAdmin-2.11.4-all-languages.zip をダウンロードし展開。c:\mysql\toolsに配置してみた。
② config.inc.phpを以下のように編集する。config.sample.inc.phpをコピーしてリネームしてから編集する。

$cfg['PmaAbsoluteUri'] = 'http://localhost/phpMyAdmin/';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
$cfg['DefaultLang'] = 'ja';

http://localhost/phpMyAdmin/index.php で利用できる。