- Compiling PHP SQLite extension from source with encryption features
- What you will need
- Prepare the source dirs
- Prepare SEE source
- Compile the SQLite3 extension
- leethax.org
- Основы использования SQLite3 в PHP
- Преимущества и ограничения
- Поддержка SQLite3 в PHP
- Особенности SQLite3
- Создание, открытие и закрытие базы данных
- Выполнение запроса
- Подготовленные запросы
- Выборка данных
- Инструменты администрирования БД SQLite
- Making php 8 use the latest version of sqlite3 on Ubuntu 20.04 LTS
- Get compile options#
- Download and compile latest sqlite#
- Replace shared library#
- Verify that everthing went smoothly#
Compiling PHP SQLite extension from source with encryption features
I am writing this post because, as often this is not documented anywhere, but if you purchased a SQLite Encryption Extension (SEE) License and want to use it within PHP, you will have to recompile the PHP SQLite3 extension from source.
What you will need
- PHP source code for your current version of PHP, found on https://www.php.net/downloads.php
- SEE source code found on the version above
- php-dev tooling for your distro, ( apt install php-dev for Debian/Ubuntu)
Prepare the source dirs
I am assuming php 7.2.27 here but correct with the version that you’re using.
mkdir ~/src tar zxf see-sources.tar.gz -C src tar zxf php-7.2.27.tar.gz -C src
Prepare SEE source
First of all the SQLite amalgamation with SEE needs to be prepared, go to your SEE source repository and issue the following:
cd ~/src/see-sources/ cat see-prefix.txt sqlite3.c see.c >sqlite3-see.c cp sqlite3-see.c ~/src/php-7.2.27/src/ext/sqlite3/libsqlite/sqlite3.c cp sqlite3.h ~/src/php-7.2.27/ext/sqlite3/libsqlite/
You have now successfully replaced the bundled sqlite3 library in the PHP source by the one with encryption features. All what’s left to do is compile it, and replace it in the running PHP. But before that…
Compile the SQLite3 extension
Compiling the PHP extension is easy, but what the documentation does not say is that a flag needs to be enabled in order for encryption to be loaded. Also, the m4 file has the wrong name for some reason and must be renamed first:
Edit config.m4 with your favorite editor, and add this to the other_flags variable (line 81 in php 7.2, could be another location depending on version):
other_flags="-DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_CORE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1"
Now it is ready to compile so just issue the regular commands:
phpize ./configure make make install
You should get the following output if all goes well:
Configuring for: PHP Api Version: 20170718 Zend Module Api No: 20170718 Zend Extension Api No: 320170718 Installing shared extensions: /usr/lib/php/20170718/ Installing header files: /usr/include/php/20170718/
Voila! Your extension should be installed in the correct location. Don’t forget to reload PHP-FPM or Apache if you’re using PHP on the server side.
leethax.org
Collection of snippets or oneliners that made my life easier 😉
Основы использования SQLite3 в PHP
В этой статье рассмотрим основы SQLite3 для PHP — полезной библиотеки (расширение для PHP), написанной на языке C, которая осуществляет механизм работы с данными с помощью SQL. Фактически, это безтиповая база данных, которая содержится всего в одном файле, который в свою очередь находится в самом проекте (в его файловой системе). Технически в этой базе всё — строки. Мы указываем тип данных для самой библиотеки, чтобы она сама «разруливала» сортировку по числовым полям.
Преимущества и ограничения
- Полностью бесплатна
- Нет необходимости в средствах администрирования
- Высокая производительность и легкая переносимость
- Поддержка процедурного и объектно-ориентированного интерфейсов
- Хранение больших объемов данных
- Хранение строк и бинарных данных неограниченной длины
- Предназначена для небольших и средних приложений
- Основной выигрыш в производительности, если преобладают операции вставки и выборки данных
- При чрезвычайно активном обращении к данным, или в случае частых сортировок, SQLite работает медленнее своих конкурентов
Поддержка SQLite3 в PHP
- ВPHP 5.0 поддержка SQLite версии 2 была встроена в ядро
- Начиная с PHP 5.1 поддержка SQLite вынесена за пределы ядра php_sqlite
- В PHP 5.3 добавлена поддержка SQLite версии 3 php_sqlite3
- В PHP 5.4 поддержка SQLite версии 2 удалена php_sqlite
Особенности SQLite3
CREATE TABLE users(id INTEGER, name TEXT, age INTEGER)
CREATE TABLE users(id, name, age)
Для задания первичного ключа
id INTEGER PRIMARY KEY id INTEGER PRIMARY KEY AUTOINCREMENT
Экранирование строк через двойной апостроф
Создание, открытие и закрытие базы данных
//Создаём или открываем базу данных test.db $db = new SQLite3("test.db"); //Закрываем базу данных без удаления объекта $db->close(); //Открываем другую базу данных для работы $db->open("another.db"); //Удаляем объект unset($db);
Выполнение запроса
//Экранирование строк $name = $db->escapeString($name); //Для запросов без выборки данных $sql = "INSERT INTO users (name, age) VALUES ('$name', 25)"; //Возвращает значение булева типа $result = $db->exec($sql); //Количество изменённых записей echo $db->changes(); //Отслеживание ошибок echo $db->lastErrorCode(); echo $db->lastErrorMsg();
Подготовленные запросы
$sql = "INSERT INTO users (name, age) VALUES (:name, :age)"; //Готовим запрос $stmt = $db->prepare($sql); //Привязываем параметры $stmt->bindParam(':name',$name); $stmt->bindParam(':age',$age); //Исполняем запрос $result = $stmt->execute(); //Закрываем при необходимости $stmt->close();
Выборка данных
$sql = "SELECT name, age FROM users"; // В случае неудачи возвращает false $result = $db->querySingle($sql); //В $result - значение первого поля первой записи $result = $db->querySingle($sql, true); // В $result - массив значений первой записи // Стандартная выборка $result = $db->query($sql); // Обработка выборки $row = $result->fetchArray(); // SQLITE3_BOTH // Получаем ассоциативный массив $row = $result->fetchArray(SQLITE3_ASSOC); // Получаем индексированный массив $row = $result->fetchArray(SQLITE3_NUM);
Инструменты администрирования БД SQLite
Sqliteman — полезный инструмент для администрирования баз данных SQLite3. Это аналог привычного phpmyadmin для MySql. Программа имеет неплохой графический интерфейс на русском языке, является портативной и не требует установки на ПК. Скачать Sqliteman можно по этой ссылке .
Ещё один популярный менеджер баз данных SQLite — SQLiteStudio
Making php 8 use the latest version of sqlite3 on Ubuntu 20.04 LTS
When installing php 8.1 on your ubuntu machine running 20.04 LTS you’re limited, at the time of writing, to sqlite3 3.31.1 since it’s the version that comes with the distribution. We’re going to make php use the latest sqlite version( 3.37.0 ) by:
Get compile options#
First off, let’s find out what compilation options we have with our current version of sqlite by jumping into the sqlite3 command line interface and getting the options:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
sqlite> PRAGMA compile_options; # my output COMPILER=gcc-9.3.0 ENABLE_COLUMN_METADATA ENABLE_DBSTAT_VTAB ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS ENABLE_FTS3_TOKENIZER ENABLE_FTS4 ENABLE_FTS5 ENABLE_JSON1 ENABLE_LOAD_EXTENSION ENABLE_PREUPDATE_HOOK ENABLE_RTREE ENABLE_SESSION ENABLE_STMTVTAB ENABLE_UNKNOWN_SQL_FUNCTION ENABLE_UNLOCK_NOTIFY ENABLE_UPDATE_DELETE_LIMIT HAVE_ISNAN LIKE_DOESNT_MATCH_BLOBS MAX_SCHEMA_RETRY=25 MAX_VARIABLE_NUMBER=250000 OMIT_LOOKASIDE SECURE_DELETE SOUNDEX THREADSAFE=1 USE_URI
Download and compile latest sqlite#
# download the latest amalgamation wget https://www.sqlite.org/2021/sqlite-amalgamation-3370000.zip # unzip it unzip sqlite-tools-linux-x86-3370000.zip # and cd into the folder cd sqlite-tools-linux-x86-3370000
Next, we’re going compile the shared sqlite3 library file. We’re going to use gcc to compile the file.
For the compilation command we’re gonna get the sqlite compile options we got before add the prefix: -DSQLITE_ to add the compile-time options alongside the rest of the command.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
# inside sqlite-tools-linux-x86-3370000/ gcc \ -Wl,-soname,libsqlite3.so.0 \ -DSQLITE_ENABLE_COLUMN_METADATA \ -DSQLITE_ENABLE_DBSTAT_VTAB \ -DSQLITE_ENABLE_FTS3 \ -DSQLITE_ENABLE_FTS3_PARENTHESIS \ -DSQLITE_ENABLE_FTS3_TOKENIZER \ -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_FTS5 \ -DSQLITE_ENABLE_JSON1 \ -DSQLITE_ENABLE_LOAD_EXTENSION \ -DSQLITE_ENABLE_PREUPDATE_HOOK \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_SESSION \ -DSQLITE_ENABLE_STMTVTAB \ -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION \ -DSQLITE_ENABLE_UNLOCK_NOTIFY \ -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \ -DSQLITE_HAVE_ISNAN \ -DSQLITE_LIKE_DOESNT_MATCH_BLOBS \ -DSQLITE_MAX_SCHEMA_RETRY=25 \ -DSQLITE_MAX_VARIABLE_NUMBER=250000 \ -DSQLITE_OMIT_LOOKASIDE \ -DSQLITE_SECURE_DELETE \ -DSQLITE_SOUNDEX \ -DSQLITE_THREADSAFE=1 \ -DSQLITE_USE_URI \ -shared \ -o libsqlite3.so \ -fPIC \ sqlite3.c
Replace shared library#
Now we should have the shared library file called libsqlite3.so . Let’s find where’s the file the php interpreter is using and then replace it with the one we just compiled.
First, we need the PID of the master process for the php-fpm:
ps -ef | grep php # output root 421802 1 0 14:34 ? 00:00:00 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf) www-data 421813 421802 0 14:34 ? 00:00:00 php-fpm: pool www www-data 421814 421802 0 14:34 ? 00:00:00 php-fpm: pool www potato 424098 417313 0 18:39 pts/0 00:00:00 grep --color=auto php
The master process has PID of 421802 , let’s use this to see the shared libraries:
sudo lsof -p 421802 | grep sqlite # output php-fpm8. 421802 root mem REG 8,0 67848 262731 /usr/lib/php/20210902/sqlite3.so php-fpm8. 421802 root mem REG 8,0 1757464 1053945 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 php-fpm8. 421802 root mem REG 8,0 39176 262730 /usr/lib/php/20210902/pdo_sqlite.so
Our shared library is located in /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 , let’s replace it with the one we compiled:
# stop php sudo systemctl stop php8.1-fpm.service # make a backup sudo mv /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6.old # overwrite the library sudo mv libsqlite3.so /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 # restart php sudo systemctl restart php8.1-fpm.service
Verify that everthing went smoothly#
If everything went alright we should now have php using the latest version of sqlite3. We can quickly verify it with:
php --ri sqlite3 # output sqlite3 SQLite3 support => enabled SQLite Library => 3.37.0 Directive => Local Value => Master Value sqlite3.extension_dir => no value => no value sqlite3.defensive => On => On
You can also check the logs to verify if everything went smoothly:
sudo journalctl -u php8.1-fpm