2021 年度 OSS リテラシ 3 : PHP のセットアップ

PHP のインストールと設定.

PHP を Debian パッケージを利用してインストールする.

パッケージは apt-cache search コマンドを用いて検索することができる.

$ apt-cache search php

  ...(略)...

PHP 関連のパッケージは大量に存在するが, php-common libapache2-mod-php php-cli を インストールしておけば依存関係によって必要なパッケージが概ねインストールされる. なお, Web サーバとして apache2 を使うので, apache2 用のモジュール (libapache2-mod-php) もインストールしている.

$ sudo -s

# apt-get update

  ...(略)...

# apt-get install php-common libapache2-mod-php php-cli 

  ...(略)...

PHP の有効化

PHP をインストール後に mods-enabled ディレクトリ以下を確認すると, PHP を使うためのファイルが存在することがわかる. このことは /var/www/html 以下で PHP を使える状態にあることを意味する.

# cd /etc/apache2/

# ls mods-enabled/*php*

  mods-enabled/php7.3.conf  mods-enabled/php7.3.load

userdir (~/public_html/) において php を使うためには, mods-enabled/php7.3.conf の設定を変更する必要がある. コメントに書かれているように, php_admin_flag engine を On にする必要がある.

# vi mods-enabled/php7.3.conf

  ...(前略)...

  # Running PHP scripts in user directories is disabled by default
  # 
  # To re-enable PHP in user directories comment the following lines
  # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
  # prevents .htaccess files from disabling it.
  <IfModule mod_userdir.c>
      <Directory /home/*/public_html>
  #        php_admin_flag engine Off   (コメントアウトする)
           php_admin_flag engine On
      </Directory>
  </IfModule>

設定を変更したら, apache2 を再起動する.

# /etc/init.d/apache2 restart

  [ ok ] Restarting apache2 (via systemctl): apache2.service.

# exit 

$

php ファイルを置いてみる. なお, <? の前や, ?> の前に「空白文字を入れない」こと!

$ cd ~/public_html

$ vi helloworld.php

  <?php
    echo "hello world (php)";
  ?>

作成が終わったら, 自分の PC のブラウザで http://10.176.0.XXX/~hogehoge/ (IP は自分のものに変え, hogehoge は自分のユーザ名に置き換えること) に アクセスし, helloworld.php を表示してみよ.

動作確認: PHP 経由でのデータベースの利用

準備

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

$ sudo apt-get update

  ...(略)...

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

  ...(略)...

$ sudo /etc/init.d/apache2 restart

  [ ok ] Restarting apache2 (via systemctl): apache2.service.

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

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

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

演習用のテーブルの作成

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

まず,中身を覗いてみる.テーブル 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
  ) 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;

次に,schema.sql を用いてテーブルを作る.

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

 Enter password: 

PHP スクリプトの利用

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

$ mkdir ~/public_html/php

$ cd ~/public_html/php

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

$ ls -l

  lrwxrwxrwx 1 hogehoge hogehoge 46  8月 26 22:51 monitoring.php -> /home/hogehoge/iotex-server/php/monitoring.php

php ファイル内の設定ファイルのパスを修正する. ユーザ名は自分のに合わせること.

$ vi monitoring.php

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

データベースに接続するための情報を用意する. ~/public_html 以下に接続情報を置くと全世界から見えてしまうので, 今回は各自のホームディレクトリ内の ~/iotex-server/conf 以下に置くものとする. 設 置した後に, ファイルのパーミッションを修正しておくこと. 自分自身 (hogehoge) と www-data グループ (Web サーバ Apache2 で使われるグループ) 以外からは閲覧できないようにしておく. HTTP からアクセスするためには, www-data ユーザもしくは www-data グループに閲覧許可をつけないといけない.

$ cd ~/iotex-server/

$ sudo chgrp www-data conf

$ sudo chgrp www-data conf/db_info.php 

$ sudo chmod 710 conf

$ sudo chmod 640 conf/db_info.php 

$ ls -ld conf/

  drwx--x--- 2 hogehoge www-data 4096 12月 10 17:32 conf/

$ ls -l conf/

  -rw-r----- 1 hogehoge www-data 83 12月 10 17:32 db_info.php

データベースの接続情報を記述する.

$ vi conf/db_info.php 

  <?php
  $SERV="localhost";
  $USER="<username>";    (適宜修正すること. "<" と ">" は削除すること)
  $PASS="<password>";    (適宜修正すること. "<" と ">" は削除すること)
  $DBNM="iotex";
  ?>

PHP から MySQL にアクセスするためのおまじない.

$ sudo  phpenmod pdo_mysql

$ sudo  /etc/init.d/apache2 restart

データベースへのデータ入力.

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

例えば以下のように, monitoring.php の ? 以降に "変数名=値" を並べて ブラウザにコピペすれば, それを確かめることができる (IP は自分の仮想サーバの IP に直すこと. hogehoge は自分のユーザ名に直すこと).

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

練習) 上記の入力を数回程度実行し, データベースに実際にデータが入力されていることを確認せよ. その際, hostname もしくは time の値は変えること.

データベースのテーブルを確認する. hogehoge は自分のユーザ名で置き換えること.

$ mysql -u hogehoge -p

  Enter password: 
  ...(略)...

  MariaDB [(none)]> use iotex;

     Database changed

  MariaDB [iotex]> select * from monitoring_hosts;

      +----------+------------+---------------------+
      | hostname | ip         | time                |
      +----------+------------+---------------------+
      | jxxxx    | 10.52.2.85 | 2018-01-01 00:00:00 |
      +----------+------------+---------------------+
      1 row in set (0.001 sec)

  MariaDB [iotex]> select * from monitoring;

      +----------+---------------------+------+-------+-------+------+-------+-------+------+------+------+---------+---------+------+---------+------+--------+--------+------+------+---------+---------+
      | hostname | time                | temp | temp2 | temp3 | humi | humi2 | humi3 | dp   | dp2  | dp3  | bmptemp | dietemp | lux  | objtemp | pres | sitemp | sihumi | eco2 | tvoc | winddir | windvel |
      +----------+---------------------+------+-------+-------+------+-------+-------+------+------+------+---------+---------+------+---------+------+--------+--------+------+------+---------+---------+
      | jxxxx    | 2018-01-01 00:00:00 |   10 |  NULL |  NULL |   80 |  NULL |  NULL | NULL | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |   NULL |   NULL | NULL | NULL |    NULL |    NULL |
      +----------+---------------------+------+-------+-------+------+-------+-------+------+------+------+---------+---------+------+---------+------+--------+--------+------+------+---------+---------+
      1 row in set (0.001 sec)

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

テーブル 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 のオンラインテキストにコピペせよ.

参考