【PHP7】PDOでソースからインストールした最新バージョンのSQLite3を使う

PHP7から軽量DBのSQLiteを使うまでの手順を説明しています。PHPからSQLiteを使う時に、PDOを利用しています。OSはCentOS7です。

※ 本ページはプロモーションが含まれています。

目的と環境

最終更新日:2021/4/20

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〜

SQLite3の最新バージョンをソースからインストールする

まず、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
これについても別ページで説明していますので、そちらを参考にしてください。
PHP実行時の警告:"PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_sqlite' 〜 undefined symbol: sqlite3_column_table_name"

SQLiteをソースからインストールできたら、バージョンの確認です。

$ sqlite3 -version
3.35.0 2021-03-12 15:10:09 acd63062eb06748bfe9e4〜

PHPのテストコード(PDOを通してSQLiteを使う)

先に、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)が、まだ入ってないためです。

(広告)アマゾンでSQL・DB(データベース)関連の本(Kindle)を探す!

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をインストールします。
(*私の環境では、remiリポジトリを使ってphp7.4をインストールしたので、--enablerepo=remi-php74を指定しています)
$ 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
今度は、エラーが出ることなく実行することができました!
ただ、SQLiteのバージョン情報を見ると、3.7.17になっています。これは新しくインストールしたSQLite(バージョン3.35)ではなく、CentOSに最初から入っていた古いSQLiteです。どうやら古いSQLiteを見てしまっているようです。

また、php-pdoをインストールした後に、Apacheを再起動して、ウェブ上でphpinfo()を実行すると、以下のようなPDO、sqliteの情報が表示されるようになりました。
phpinfoでPDOのSQLite libraryのバージョンが3.7.17

PDO(php-pdo)をインストールしたので、この情報が表示されるのが良いのですが、SQLite Libraryのバージョン情報を見ると3.7.17となっていて、これも意図しない古いSQLiteのバージョンです。

コマンドライン上でPHPを実行する時に、インストールした最新の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に変更されました!期待通りの結果が得られたので、これで問題ないです。

ウェブ(Apache)上でPHPを実行する時に、インストールした最新のSQLiteを使うように設定する

コマンドライン上では問題なくなりましたが、ウェブ上で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()を実行して確認してみます。 phpinfoでPDOのSQLite libraryのバージョンが3.35

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