PHP7から軽量DBのSQLiteを使うまでの手順を説明しています。PHPからSQLiteを使う時に、PDOを利用しています。OSはCentOS7です。
※ 本ページはプロモーションが含まれています。
PHP7から軽量DBのSQLiteを使うまでの手順を書いていきます。PHPは、コマンドライン上とウェブ上の両方を試しています。
また、PHPからSQLiteを使う時には、PDOを使っています。PDOは、各種データベースへ接続するためのPHPの拡張モジュールです。
動作環境はこちらです。
$ cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
$ php -v
PHP 7.4.16 (cli) (built: Mar 2 2021 10:35:17) ( NTS )
$ #ソースからインストールしたSQLite3のバージョン
$ sqlite3 -version
3.35.0 2021-03-12 15:10:09 acd63062eb06748bfe9e4〜
まず、CentOS7にはデフォルトでSQLite3が入っていたけどバージョンが古かったので(バージョン3.7.17が入っていた)、SQLiteのバージョン3.35(2021/3/12時点の最新バージョン)をソースからインストールしました。
SQLiteのソースからのインストール手順は別ページで説明していますので、そちらを参考にしてください。
(Amazon Linux2(ec2),CentOS7)SQLite3の最新バージョンをインストールする
SQLiteをソースからインストールする際に1つ注意点ですが、PHPからSQliteを使う場合、./configureコマンドはCFLAGSオプションを指定して以下のように実行します。
$ CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1" ./configure
これについても別ページで説明していますので、そちらを参考にしてください。SQLiteをソースからインストールできたら、バージョンの確認です。
$ sqlite3 -version
3.35.0 2021-03-12 15:10:09 acd63062eb06748bfe9e4〜
先に、PDOを通してSQLiteを使うPHPのテストコードを示しておきます。
(SQLiteのバージョンを確認するだけのコードです。)
$ cat testphp.php
<?php
print_r(SQLite3::version());
echo "=========".PHP_EOL;
$ver = SQLite3::version();
echo $ver['versionString'] . "\n";
echo $ver['versionNumber'] . "\n";
echo "==========".PHP_EOL;
$db = new SQLite3('test.sqlite3');
$version = $db->querySingle('select sqlite_version()');
echo $version . "\n";
?>
現状、このコードを実行するとエラーが出ます。
$ php testphp.php
PHP Fatal error: Uncaught Error: Class 'SQLite3' not found in /home/〜/testphp.php:2
これは、PDOを使うために必要なモジュール(php-pdo)が、まだ入ってないためです。
次に、PHPでSQLiteを使えるようにするためのPDOをインストールしていきます。
PDOは、yumでphp-pdoをインストールすれば入ります。
私の環境のphp-pdoをインストールする前のphp関連のインストールされているモジュール一覧です。
$ yum list installed | grep php
oniguruma5php.x86_64 6.9.6-1.el7.remi @remi-safe
php.x86_64 7.4.16-1.el7.remi @remi-php74
php-cli.x86_64 7.4.16-1.el7.remi @remi-php74
php-common.x86_64 7.4.16-1.el7.remi @remi-php74
php-json.x86_64 7.4.16-1.el7.remi @remi-php74
php-mbstring.x86_64 7.4.16-1.el7.remi @remi-php74
php-sodium.x86_64 7.4.16-1.el7.remi @remi-php74
それでは、php-pdoをインストールします。$ sudo yum install --enablerepo=remi-php74 php-pdo
〜
インストール:
php-pdo.x86_64 0:7.4.16-1.el7.remi
完了しました!
インストールできたら、再度インストールされているモジュール一覧を確認します。
$ yum list installed | grep php
oniguruma5php.x86_64 6.9.6-1.el7.remi @remi-safe
php.x86_64 7.4.16-1.el7.remi @remi-php74
php-cli.x86_64 7.4.16-1.el7.remi @remi-php74
php-common.x86_64 7.4.16-1.el7.remi @remi-php74
php-json.x86_64 7.4.16-1.el7.remi @remi-php74
php-mbstring.x86_64 7.4.16-1.el7.remi @remi-php74
php-pdo.x86_64 7.4.16-1.el7.remi @remi-php74
php-sodium.x86_64 7.4.16-1.el7.remi @remi-php74
php-pdoが追加されているので、問題なさそうです。
PDO(php-pdo)がインストールできたので、上で示したPHPのテストコードを実行してみます。
$ php testphp.php
Array
(
[versionString] => 3.7.17
[versionNumber] => 3007017
)
=========
3.7.17
3007017
==========
3.7.17
今度は、エラーが出ることなく実行することができました!また、php-pdoをインストールした後に、Apacheを再起動して、ウェブ上でphpinfo()を実行すると、以下のようなPDO、sqliteの情報が表示されるようになりました。
PDO(php-pdo)をインストールしたので、この情報が表示されるのが良いのですが、SQLite Libraryのバージョン情報を見ると3.7.17となっていて、これも意図しない古いSQLiteのバージョンです。
現状、コマンドライン上でPHPを実行した時に、インストールしたSQLite(3.35)ではなく、古いSQLite(3.7.17)を見てしまっているので、インストールしたSQLiteを使うように設定していきます。
~/.bashrcファイル内で、環境変数LD_LIBRARY_PATHに/usr/local/libディレクトリを指定します。
/usr/local/libには、インストールしたsqlite3のライブラリがあります。
$ vim ~/.bashrc
#この1行を追加する
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
sourceコマンドで、~/.bashrcファイルを反映させます。
$ source ~/.bashrc
これで再度、phpのテストコードを実行します。
$ php testphp.php
Array
(
[versionString] => 3.35.0
[versionNumber] => 3035000
)
=========
3.35.0
3035000
==========
3.35.0
SQLiteのバージョンが、インストールした3.35に変更されました!期待通りの結果が得られたので、これで問題ないです。
コマンドライン上では問題なくなりましたが、ウェブ上でPHPを実行すると、まだ古いSQLiteの情報が表示されるので、ウェブ上でもインストールしたSQLiteを使えるように設定していきます。
Apacheでは起動時に、~/.bashrcではなく、別の環境変数設定ファイルを読み込んで見ています(CentOS7、Apache2.4では、/etc/sysconfig/httpdというファイルがあり、それを読み込んで見ている)。
ですので、/etc/sysconfig/httpdファイル内でも、環境変数LD_LIBRARY_PATHに/usr/local/libディレクトリを指定する必要があります。
$ sudo vim /etc/sysconfig/httpd
#この1行を追加する
LD_LIBRARY_PATH=/usr/local/lib
また、/usr/lib/systemd/system/httpd.serviceファイル内の、EnvironmentFileの値が"/etc/sysconfig/httpd"になっている事を確認します。
$ locate httpd.service
/etc/systemd/system/multi-user.target.wants/httpd.service
/usr/lib/systemd/system/httpd.service
$ cat /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
〜
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
〜
編集が完了したら、Apacheを再起動します。
$ sudo systemctl restart httpd
これで再度、ウェブ上でphpinfo()を実行して確認してみます。
SQLite Libraryのバージョンが、インストールした3.35に変更されました!
ec2のAmazon Linux 2の場合(Apacheは2.4)、/etc/sysconfig/httpdファイル自体が存在しないので、/etc/sysconfig/httpdファイルを作って、あとは同じように1行コードを書いておきます。
LD_LIBRARY_PATH=/usr/local/lib
また、/usr/lib/systemd/system/httpd.serviceファイル内にEnvironmentFileの記述がないので、[Service]配下に1行コードを書いておきます。
[Service]
〜
EnvironmentFile=/etc/sysconfig/httpd
そして、編集後にApacheを再起動すると、警告(Warning)が出ました。
$ sudo systemctl restart httpd
Warning: httpd.service changed on disk. Run 'systemctl daemon-reload' to reload units.
ですので警告メッセージどおりに"systemctl daemon-reload"を実行して、再度Apacheを再起動すると、正常にApacheが起動し、phpinfo()のSQLite Libraryのバージョンも3.35に変更されました。
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd