2022 年度 OSS リテラシ3 : WWW サーバとデータベースサーバの連動

はじめに

WWW サーバの受け取った情報を,PHP 言語で書かれたプログラムを介して, データベースに登録できるようにする.

以下の設定方法は Debian wiki に従っている. <URL:https://wiki.debian.org/PHP>.

準備

パッケージインストール

php から mysql を利用するためのライブラリをインストールする.

$ sudo apt update

$ sudo apt install php-mysql php-mdb2-driver-mysql

  ...(略)...

WWW サーバを再起動する

$ sudo systemctl restart apache2

PHP のサンプルファイルの取得

GitHub からサンプルを取得する.

$ cd   (ホームディレクトリに移動)

$ sudo apt install git

$ git clone https://github.com/sugiymki/iotex-server.git

演習用のテーブルの作成

データベース iotex 内に必要となるテーブル (表) を複数作成する. GitHub から clone したソフトウェア内にテーブルを作るためのコードが 含まれているので, それを利用する.

まず,中身を覗いてみる.データベース操作言語 (SQL) で テーブル monitoring と monitoring_hosts が定義されていることがわかる.

$ lv ~/iotex-server/sample/schema.sql

  CREATE TABLE `monitoring` (
    `hostname` varchar(20) CHARACTER SET utf8 NOT NULL,
    `time` datetime NOT NULL,
    `temp` double DEFAULT NULL,
    `temp2` double DEFAULT NULL,
    `temp3` double DEFAULT NULL,
    `humi` double DEFAULT NULL,
    `humi2` double DEFAULT NULL,
    `humi3` double DEFAULT NULL,
    `dp` double DEFAULT NULL,
    `dp2` double DEFAULT NULL,
    `dp3` double DEFAULT NULL,
    `bmptemp` double DEFAULT NULL,
    `dietemp` double DEFAULT NULL,
    `lux` double DEFAULT NULL,
    `objtemp` double DEFAULT NULL,
    `pres` double DEFAULT NULL,
    `sitemp` double DEFAULT NULL,
    `sihumi` double DEFAULT NULL,
    `eco2` double DEFAULT NULL,
    `tvoc` double DEFAULT NULL,
    `winddir` double DEFAULT NULL,
    `windvel` double DEFAULT NULL
    PRIMARY KEY (`hostname`, `time`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


  CREATE TABLE `monitoring_hosts` (
    `hostname` varchar(20) NOT NULL,
    `ip` varchar(15) DEFAULT NULL,
    `time` datetime DEFAULT NULL,
    PRIMARY KEY (`hostname`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

確認したら,MySQL のユーザ iotex で,schema.sql を用いてテーブルを作る. パスワードを聞かれるが,これは MariaDB の iotex ユーザを作成する際に指定したパスワードを入力すること.

$ mysql -u iotex -p iotex < ~/iotex-server/sample/schema.sql 

 Enter password: <設定した iotex のパスワードを入力>

データベース iotex の中に, monitoring と monitoring_hosts の 2 つのテーブルが作成できたことが確認する. ターミナル上から以下のようにコマンドを打てば良い (-e の後ろにデータベース操作言語で命令を書く)

$ mysql -u iotex -p -h localhost iotex -e "show tables"

  Enter password:
  +------------------+
  | Tables_in_iotex  |
  +------------------+
  | monitoring       |
  | monitoring_hosts |
  +------------------+

PHP スクリプトの利用

GitHub から clone したソフトウェアに含まれる PHP ファイルを ~/public_html/php 以下にリンクして利用する.

$ mkdir ~/public_html/php

$ cd ~/public_html/php

$ ln -s ~/iotex-server/php/monitoring.php .

データベースに接続するための情報を用意し, それを PHP スクリプトで使うことにする. ファイルは自分自身と www-data グループ (Web サーバで使われるグループ) 以外からは閲覧できないようにしておく. HTTP からアクセスするためには, www-data ユーザもしくは www-data グループに閲覧許可をつけないといけない.

$ cd

$ chgrp www-data ~/iotex-server/conf/db_info.php

$ chmod 640 ~/iotex-server/conf/db_info.php   

$ vi ~/iotex-server/conf/db_info.php

  <?php
  $SERV="localhost";
  $USER="iotex"; 
  $PASS="<password>";    (パスワードを書く. "<" と ">" は削除すること)
  $DBNM="iotex";
  ?>

さらに,サンプルスクリプト内の設定ファイルのパスを修正する. /home/user の user 部分を自分のアカウント名に変更する.

$ vi ~/public_html/php/monitoring.php

  // 設定ファイル
  require_once("/home/user/iotex-server/conf/db_info.php");

PHP 経由でのデータベースへのデータ入力.

GitHub で配布した php スクリプトは http の GET メソッドを使って 送られてきたデータをデータベースに格納してる.

例えば以下のように, monitoring.php の ? 以降に "変数名=値" を並べて ブラウザにコピペすれば, それを確かめることができる. 以下は jxxxx という名前のデバイスから,時刻 2022/09/01 00:00:00 に, 温度 10.0, 湿度 80 が送られてきたことに相当する.

なお,IP と ユーザ名 (hogehoge) は自分のものに変更すること!

http://10.176.0.XX/~hogehoge/php/monitoring.php?hostname=jxxxx&time=2022-10-01T00:00:00&temp=10.0&humi=80

うまくいくと以下のような表示が現れるはずである.これは実行されたデータベース操作言語の命令である.

insert into monitoring (hostname,time,temp,temp2,temp3,humi,humi2,humi3, dp,dp2,dp3,bmptemp,dietemp,lux,objtemp,pres,sitemp,sihumi,eco2,tvoc) values( "jxxxx","2022-10-01T00:00:00",10.00,null,null,80.00,null,null,null,null,null,null,null,null,null,null,null,null,null,null ) ON DUPLICATE KEY UPDATE temp=10.00,temp2=null,temp3=null,humi=80.00,humi2=null,humi3=null,dp=null,dp2=null,dp3=null,bmptemp=null,dietemp=null,lux=null,objtemp=null,pres=null,sitemp=null,sihumi=null,eco2=null,tvoc=null
INSERT INTO monitoring_hosts VALUES("jxxxx","192.168.0.19","2022-09-01T00:00:00") ON DUPLICATE KEY UPDATE ip="192.168.0.19",time="2022-09-01T00:00:00"

なお,ブラウザ上に以下のように ERROR が出た場合は,db_info.php に書いたパスワードが 間違っていた可能性が高い.

ERROR: SQLSTATE[HY000] [1045] Access denied for user 'iotex'@'localhost' (using password: YES)INSERT INTO monitoring_hosts VALUES("jxxxx","192.168.0.19","2018-01-01T00:00:00") ON DUPLICATE KEY UPDATE ip="192.168.0.19",time="2018-01-01T00:00:00"

動作確認

$ mysql -u iotex -p iotex -e "select * from monitoring"

  Enter password:
  +----------+---------------------+------+-------+-------+------+-------+-------+------+------+------+---------+---------+------+---------+------+--------+--------+------+------+---------+---------+
  | hostname | time                | temp | temp2 | temp3 | humi | humi2 | humi3 | dp   | dp2  | dp3  | bmptemp | dietemp | lux  | objtemp | pres | sitemp | sihumi | eco2 | tvoc | winddir | windvel |
  +----------+---------------------+------+-------+-------+------+-------+-------+------+------+------+---------+---------+------+---------+------+--------+--------+------+------+---------+---------+
  | jxxxx    | 2022-10-01 00:00:00 |   10 |  NULL |  NULL |   80 |  NULL |  NULL | NULL | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |   NULL |   NULL | NULL | NULL |    NULL |    NULL |
  +----------+---------------------+------+-------+-------+------+-------+-------+------+------+------+---------+---------+------+---------+------+--------+--------+------+------+---------+---------+

$ mysql -u iotex -p iotex -e "select * from monitoring_hosts"

  Enter password:
  +----------+--------------+---------------------+
  | hostname | ip           | time                |
  +----------+--------------+---------------------+
  | jxxxx    | 192.168.0.19 | 2022-10-01 00:00:00 |
  +----------+--------------+---------------------+

[参考] データベースのテーブル

テーブル monitoring
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| hostname      | varchar(20) | YES  |     | NULL    |       |ホスト名
| time          | datetime    | YES  |     | NULL    |       |時刻
| temp          | double      | YES  |     | NULL    |       |温度 (SHT75, 1 or Si7021)
| temp2         | double      | YES  |     | NULL    |       |温度 (SHT75, 2)
| temp3         | double      | YES  |     | NULL    |       |温度 (SHT75, 3)
| humi          | double      | YES  |     | NULL    |       |湿度 (SHT75, 1 or Si7021)
| humi2         | double      | YES  |     | NULL    |       |湿度 (SHT75, 2)
| humi3         | double      | YES  |     | NULL    |       |湿度 (SHT75, 3)
| dp            | double      | YES  |     | NULL    |       |露点温度 (SHT75, 1)
| dp2           | double      | YES  |     | NULL    |       |露点温度 (SHT75, 2)
| dp3           | double      | YES  |     | NULL    |       |露点温度 (SHT75, 3)
| bmptemp       | double      | YES  |     | NULL    |       |温度 (BMP180)
| dietemp       | double      | YES  |     | NULL    |       |基板温度 (TMP007)
| lux           | double      | YES  |     | NULL    |       |照度 (TSL2561)
| objtemp       | double      | YES  |     | NULL    |       |放射温度 (TM007)
| pres          | double      | YES  |     | NULL    |       |圧力 (BMP180)
| sitemp        | double      | YES  |     | NULL    |       |温度 (Si7021)
| sihumi        | double      | YES  |     | NULL    |       |湿度 (Si7021)
| eco2          | double      | YES  |     | NULL    |       |CO2 濃度 (SGP30)
| tvoc          | double      | YES  |     | NULL    |       |総揮発性有機化合物量 (SGP30)
| winddir       | double      | YES  |     | NULL    |       |風向
| windvel       | double      | YES  |     | NULL    |       |風速
+---------------+-------------+------+-----+---------+-------+

テーブル monitoring_hosts
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| hostname | varchar(20) | NO   | PRI | NULL    |       | ホスト名
| ip       | varchar(15) | YES  |     | NULL    |       | IP アドレス
| time     | datetime    | YES  |     | NULL    |       | 時刻
+----------+-------------+------+-----+---------+-------+

課題

monitoring.php を用いてテーブルに値を入れる操作を数回行なった後, MySQL モニタでテーブルの値を一覧表示せよ. 実行した SQL 文とその戻り値を wbt のオンラインテキストにコピペせよ.