SQLite を試験したくなったので、環境を Docker で作ることにしました。
ベースは CentOS7 + Apache + PHP7 (Composer, Xdebug) の開発環境を Docker で作る で。
構成
ディレクトリ構造
PROJECT_ROOT/
│
# 略
│
├ sqlite/
│
# 略
SQLite 用のディレクトリを掘っただけで、後は同じです。
docker-compose.yml
version: '3.8'
services:
web:
build:
context: ./apache/docker
dockerfile: Dockerfile
args:
# 略
SQLITE_TABLENAME: $SQLITE_TABLENAME
labels:
lamp.sqlite.php: "SQLite PHP"
volumes:
# 略
# sqlite
- ./sqlite:/var/sqlite/
# 略
entrypoint: bash -c "bash /workspace/entrypoint.sh $WEB_ROOT_DIRECTORY $WEB_DOMAIN $WEB_HOST_PORTNUM $WEB_CONTAINER_PORTNUM $WEB_HOST_PORTSSL $WEB_CONTAINER_PORTSSL $SQLITE_TABLENAME && /bin/bash"
docker-compose.yml
も大部分は同じです。変数(SQLITE_TABLENAME
)とボリュームがそれぞれ1つ増えたのと、 entrypoint へ渡す引数が1つ増えたくらいです。
.env
WEB_ROOT_DIRECTORY=sample_sqlite
WEB_DOMAIN=lvh.me
WEB_HOST_PORTNUM=8080
WEB_CONTAINER_PORTNUM=80
WEB_HOST_PORTSSL=4043
WEB_CONTAINER_PORTSSL=443
SQLITE_TABLENAME=maindb
上述の通り、 SQLite のファイル名を決める変数が増えました。
apache/docker/Dockerfile
FROM centos:centos7
# 略
# enable repository remi & remi-php74
RUN yum-config-manager --enable remi && yum-config-manager --enable remi-php74
# php
RUN yum -y install php php-devel php-pdo php-mysqlnd php-mbstring php-gd php-pear php-pecl-apc-devel zlib-devel php-xml php-mcrypt php-pecl-xdebug
# sqlite
RUN yum -y install sqlite sqlite-devel
# disable repository remi & remi-php74
RUN yum-config-manager --disable remi && yum-config-manager --disable remi-php74
# 略
# volume directory
RUN mkdir /template
RUN mkdir /var/www/${WEB_ROOT_DIRECTORY}
RUN mkdir /var/www/${WEB_ROOT_DIRECTORY}/web
RUN mkdir /workspace
RUN mkdir /var/sqlite
こちらも概ね同じ。 PHP のインストール直後に sqlite
, sqlite-devel
をインストールしています。また、最後にボリュームとしてマウントするディレクトリを作成しています。
workspace/entrypoint.sh
# 略
# make sqlite file & create dummy table
if [[ ! -e /var/sqlite/${7}.sqlite3 ]]; then
echo ".exit" | echo "create table testtable(one varchar(10), two smallint);" | sqlite3 /var/sqlite/${7}.sqlite3
fi
# Apache start
/usr/sbin/httpd -DFOREGROUND &
entrypoint も同様ほぼ同じですが、 Apache 起動前に「もし SQLite のデータファイルが該当ディレクトリにない場合は作成」の処理を追加しました。テーブルがないとファイルが生成されなかったので、ダミーテーブルも CREATE しています。
検証
上述で構築された SQLite にダミーデータを流し込んでテストしてみます。
# sqlite3 /var/sqlite/maindb.sqlite3
sqlite> insert into testtable values('hello', 10);
sqlite .exit
#
まずはダミーテーブルにダミーデータを INSERT します。
<?php
try {
$pdo = new PDO('sqlite:/var/sqlite/maindb.sqlite3');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$stmt = $pdo->prepare("SELECT * FROM testtable WHERE two >= :two");
$stmt->execute([
'two' => 5
]);
$result = $stmt->fetchAll();
var_dump($result);
}
catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
次に上述のような index.php
を作成し、Webアクセスします。
/var/www/sample_sqlite/web/index.php:25:
array (size=1)
0 =>
array (size=2)
'one' => string 'hello' (length=5)
'two' => string '10' (length=2)
結果。これで PHP から PDOオブジェクト 経由でダミーテーブルに接続できたので、ひとまず環境構築という点では完了です。
参考
- php 7.4をソースからインストール時にchecking for sqlite3 > 3.7.4… no configure: error: Package requirements (sqlite3 > 3.7.4) were not met:
- コマンドの途中で聞いてくる yes を自動入力したい?それ yes で出来るよ – 自主的20%るぅる
- シェルスクリプトでファイルの存在を確認する方法 | LFI
- PHP から SQLite を使う手順 – ラボラジアン
- 最終的には SQLite3オブジェクト からではなく PDOオブジェクト から接続してしまいましたが
- PHP + SQLite3 超入門したメモ – Qiita