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
データベースのテーブルを確認する. 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 のオンラインテキストにコピペせよ.
参考
- 設定方法は Debian wiki が参考になる. <URL:https://wiki.debian.org/PHP> を参照.