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