学習用サーバ構築

いい加減、ちゃんとPHP8を勉強しようかと思って、vagrantを使用してサクッと仮想サーバでも建てましょうか、なんて一念発起。よし、サクッと。

CentOSさんが息してない…

2021年末、CentOSがサポート・開発とも終了という話があります。CentOS7については、アナウンス通り2024年6月末までサポートされますが、以降のCentOSは開発しない、とのことです。ということは、今さらCentOSでサーバを建てても、あまりうまみもないし意義もないのかな、ということで、今回はUbuntuで。Debian系なので、いろいろと勝手が違いますね。
ともかく、やってみましょう。

今回のゴール

apache, php8.1, mysqlとインストールして、phpinfo();を表示したのち、mysqlから簡易的にデータを取ってきて、ブラウザで表示するところまでです。
mysqlのデータがブラウザで見られればゴールです。

vagrant -v

自分の手元のvagrantは、

Vagrant 2.2.19

となっています。では、Ubuntuを取ってきましょう。今回は、Ubuntu bentoの最新を使ってみます。
vagrant box search を使って、bento/Ubunts – 20.04あたりを拾ってみましょう。探してみると、ありました。vagrant initのコマンドは、以下の通りです。
よしなに、適当なディレクトリを新たに掘って、そこの中で作業しましょう。

vagrant init bento/ubuntu-20.04
vagrant up

いつも通り、Vagrantfileができました。こちらのファイルを、一部編集します。というのも、なんでしょう、

config.vm.network "private_network", ip: "192.168.33.10"

おなじみのIPアドレスを指定するこの部分、今は192.168.56.xxを指定しないとvagrant upしたときにerror吐くんですよね。なので今回は、

config.vm.network "private_network", ip: "192.168.56.10"

でやってみます。あとは、vagrant upすれば、よしなにupが完了します。初回はイメージを拾ってくるので、少々お時間かかります。。。問題なければ、vagrant sshで仮想サーバ内部に侵入しましょう。おじゃましますよっと。

さて、まずはkernel周りの整備をしましょう。何も考えずに(?)、

sudo apt update

を実行します。あ、sudoしちゃって、全部をroot権限でやってもかまいません。vagrantの仮想サーバに限って言えば、それほど気にしないでも良いかと思います。本番サーバなんかではオススメしません。
さて、実はこれだけだとphp8が拾えません。デフォルトのaptにはいないんです。なので、さらに、

sudo add-apt-repository ppa:ondrej/php
sudo apt update

を実行します。これでphp8が見えるようになりました。めでたしめでたし、とはなりません。順次、以下の通りコマンドを実行していきましょう。

apacheのインストール

sudo apt install apache2

mysqlのインストールと確認

sudo apt install mysql-server
sudo mysql_secure_installation
sudo mysql
exit;

mysql_secure_installationは、お約束の設定ですね。仮想サーバなのですが、いろいろな設定を対話式でできるので、ちゃちゃっと。
最後のexit;は、mysqlからの脱出です。また、mysqlに入るときも、mysql -u rootでももちろん良いのですが、最近はこちらが流行り気味。仮想サーバですので、お好きな方で。

php8.1のインストール

sudo apt-get update
sudo apt install php8.1 libapache2-mod-php8.1 php8.1-mysql php8.1-mbstring

1行目のapt-get updateは不要な気がしますが、実行した跡があったので、一応書いておきます。なんだろ、apt-get updateしないとなんか通らなかったのかな。と思いつつも、apt updateじゃないんだよな…。と見返しています。
php8.1のモジュールは、ここでは必要最低限だけ入れています。必要に応じて、追加しちゃってください。
では、mysqlに、テストユーザを作り、適当なスキーマ、適当なテーブルを作り、適当なデータを入れてみましょう。スキーマは、test_dbとしておきますが、お好きなお名前に変えちゃってかまいません。

mysql整備

sudo mysql
CREATE DATABASE test_db;
CREATE USER 'テストユーザ名'@'%' IDENTIFIED WITH mysql_native_password BY '任意のパスワード';
GRANT ALL ON test_db.* TO 'テストユーザ名'@'%';
exit;

まずは、テスト用のDB、テスト用ユーザを作り、権限を付与するところまでです。特筆すべき点はないので、そのまま進みます。

mysql -u テストユーザ名 -p
CREATE TABLE test_db.todo_list (item_id INT AUTO_INCREMENT,content VARCHAR(255),PRIMARY KEY(item_id));
INSERT INTO test_db.todo_list (content) VALUES ("Test Data 001");
INSERT INTO test_db.todo_list (content) VALUES ("Test Data 002");
INSERT INTO test_db.todo_list (content) VALUES ("Test Data 003");
exit;

いったんrootを抜けたら、作成したユーザでmysqlにログインします。
CREATE TABLE test_db.todo_list ~ なんてやってますが、素直に、

use test_db;

で良かったんじゃないか、と反省。
ともかく、テストDB、テストユーザ、テストデータが完成しました。あとは、phpinfoを確認して、データを引っ張ってみましょう。

確認

ここまでやっていれば、/var/www/html があるはずなので、vagrantの外、いわゆるホストと共有してしまいましょう。それが早いですし、後々便利です。
Vagrantfileの一部を、以下のように編集します。

config.vm.synced_folder "./src", "/var/www/html"

この”./src”の部分は、お手元の環境に合わせていただければ。Vagrantfileを書き換えたら、いつも通りホスト側で

vagrant reload

を実行し、仮想サーバを再起動します。あとは、ホスト側の”./src”ディレクトリに、

<?php
phpinfo();

とだけ書いたファイルを作成し、適当にtest.phpとでも名前をつけて保存します。ブラウザから、192.168.56.10/test.php でアクセスすれば、表示されるはずです。phpのtimezoneが未設定ですので、必要に応じてphp.iniを編集してくださいませ。編集すべきphp.iniはphpinfoを見れば大丈夫だと思いますが、自分の環境では以下のphp.iniでした。
また、php.ini書き換え後は、apacheをrestartしてください。

sudo vim /etc/php/8.1/apache2/php.ini
sudo service apache2 restart

データベース接続とデータ読み込み

テスト用のDBに対して、CONNECTからSELECTを行って、ブラウザで表示してみましょう。あと一息。
以下のようなファイルを作成し、適当にlist.phpとでも名前をつけて保存します。

<?php
$user = "テストユーザ名";
$password = "テストユーザのパスワード";
$database = "テストDB名";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>test data</h2><ol>";
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

あとは、192.168.56.10/list.php でアクセスしてみて、データが引っ張れていれば成功です。
あくまでも確認用であり、データが読めて表示できればOK、というレベルですので、「直接SELECT文書くなよ」「ほかにもっといい方法あるだろ」などなど、クスッと笑える面白い突っ込みはご遠慮いただければ幸いです。

最後に

久々にvagrantで仮想サーバを建てました。IT業からしばし離れてしまっていたので、CentOSの件などは知りませんでした。ちゃんとアンテナ張ってないとダメだなぁと反省。
さて、php8の勉強を進めましょう。
あ、今読んでるのは…独習PHP第4版 です。あ、広告とかではありません。ただのアマゾンリンクです。アドセンス申請していませんし、今申請しても通らないでしょうから…。
こちらの独習PHP第4版ですが、ページ数がかなり多いのですが、前半のやれ変数だの配列だの、ifだのwhileだのは、ほぼほぼ眺める程度でスルーしています。さすがに、ここを理解できないとか忘れてることはありませんので。ただ、正規表現、おまえはダメだ。phpのついで、みたいなノリで勉強するようなもんじゃない。これは別でちゃんと勉強するから待ってろよ。