tag:crieit.net,2005:https://crieit.net/tags/SQLite3/feed
「SQLite3」の記事 - Crieit
Crieitでタグ「SQLite3」に投稿された最近の記事
2021-05-01T13:28:14+09:00
https://crieit.net/tags/SQLite3/feed
tag:crieit.net,2005:PublicArticle/17047
2021-05-01T13:26:57+09:00
2021-05-01T13:28:14+09:00
https://crieit.net/posts/sqlite-docker-20210501
Docker で PHP + SQLite3 の開発環境を構築する
<p>SQLite を試験したくなったので、環境を Docker で作ることにしました。</p>
<p>ベースは <a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2021/02/12/docker_centos7_apache_php_xdebug/">CentOS7 + Apache + PHP7 (Composer, Xdebug) の開発環境を Docker で作る</a> で。</p>
<h2 id="構成"><a href="#%E6%A7%8B%E6%88%90">構成</a></h2>
<h3 id="ディレクトリ構造"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">ディレクトリ構造</a></h3>
<pre><code>PROJECT_ROOT/
│
# 略
│
├ sqlite/
│
# 略
</code></pre>
<p>SQLite 用のディレクトリを掘っただけで、後は同じです。</p>
<h3 id="docker-compose.yml"><a href="#docker-compose.yml">docker-compose.yml</a></h3>
<pre><code class="yaml">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"
</code></pre>
<p><code>docker-compose.yml</code> も大部分は同じです。変数(<code>SQLITE_TABLENAME</code>)とボリュームがそれぞれ1つ増えたのと、 entrypoint へ渡す引数が1つ増えたくらいです。</p>
<h3 id=".env"><a href="#.env">.env</a></h3>
<pre><code class="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
</code></pre>
<p>上述の通り、 SQLite のファイル名を決める変数が増えました。</p>
<h3 id="apache/docker/Dockerfile"><a href="#apache%2Fdocker%2FDockerfile">apache/docker/Dockerfile</a></h3>
<pre><code class="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
</code></pre>
<p>こちらも概ね同じ。 PHP のインストール直後に <code>sqlite</code>, <code>sqlite-devel</code> をインストールしています。また、最後にボリュームとしてマウントするディレクトリを作成しています。</p>
<h2 id="workspace/entrypoint.sh"><a href="#workspace%2Fentrypoint.sh">workspace/entrypoint.sh</a></h2>
<pre><code class="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 &
</code></pre>
<p>entrypoint も同様ほぼ同じですが、 Apache 起動前に「もし SQLite のデータファイルが該当ディレクトリにない場合は作成」の処理を追加しました。テーブルがないとファイルが生成されなかったので、ダミーテーブルも CREATE しています。</p>
<h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2>
<p>上述で構築された SQLite にダミーデータを流し込んでテストしてみます。</p>
<pre><code class="bash"># sqlite3 /var/sqlite/maindb.sqlite3
sqlite> insert into testtable values('hello', 10);
sqlite .exit
#
</code></pre>
<p>まずはダミーテーブルにダミーデータを INSERT します。</p>
<pre><code class="php"><?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;
}
</code></pre>
<p>次に上述のような <code>index.php</code> を作成し、Webアクセスします。</p>
<pre><code>/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)
</code></pre>
<p>結果。これで PHP から PDOオブジェクト 経由でダミーテーブルに接続できたので、ひとまず環境構築という点では完了です。</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://it-afi.com/php/post-1253/">php 7.4をソースからインストール時にchecking for sqlite3 > 3.7.4… no configure: error: Package requirements (sqlite3 > 3.7.4) were not met:</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.agent-grow.com/self20percent/2018/08/06/linux-command-auto-yes/">コマンドの途中で聞いてくる yes を自動入力したい?それ yes で出来るよ – 自主的20%るぅる</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://linuxfan.info/post-1739">シェルスクリプトでファイルの存在を確認する方法 | LFI</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://laboradian.com/how-to-use-sqlite-from-php/">PHP から SQLite を使う手順 – ラボラジアン</a>
<ul>
<li>最終的には SQLite3オブジェクト からではなく PDOオブジェクト から接続してしまいましたが</li>
</ul></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/39_isao/items/a5b4940138bced936de0">PHP + SQLite3 超入門したメモ - Qiita</a></li>
</ul>
arm-band