はじめに
MongoDBの公式サイトに書かれている内容を実際に試してみました.
- MongoDB PHP Driver(mongodb-1.14.1)の導入
- MongoDB PHP Library(mongodb-php-library-1.13)の導入
- PHPから実際に書き込み/読み込み
なお,以下の記事の通り,AlmaLinux9にMongoDBをインストール済みの状態を前提とします.
また,以下の記事を参考にLAMP環境を構築済みの状態です.
前提条件
- AlmaLinux 9.0
- Apache 2.4.51
- PHP 7.4.32
- MongoDB 6.0.2
MongoDB PHP Driverの導入
1. 必要なライブラリのインストール
後々要求されるので,必要なライブラリをあらかじめ入れておきます.
調べた限り,環境によっては他にも色々要求されることがあるみたいです.
sudo dnf install php-devel php-pear
2. peclでインストール
公式に書いてある通り,peclを用いてドライバーのインストールをします.
sudo pecl install mongodb
...
Build process completed successfully
Installing '/usr/lib64/php/modules/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.14.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
4. php.iniの編集
先ほどの出力結果に書いてあったとおり,php.iniに加筆しないと動きません.
ちなみに昔はファイル名がmongo.soだったらしく,調べると結構その時の記事がヒットして混乱しました(一敗).
sudo vim /etc/php.ini
#最終行に加筆
extension = mongodb.so
加筆したら,apacheとphpを再起動しておきます.
sudo systemctl restart httpd
sudo systemctl restart php-fpm
PHP Liblaryの導入
1. Composerのインストール
composerのインストール方法はいくつかあるみたいですが,今回はwgetを使う方法でやってみます.
wgetが無い場合は,あらかじめインストールしておきます.
sudo dnf install -y wget
composerのインストーラーをwgetを使ってとってきます.
wget https://getcomposer.org/installer -O composer-installer.php
インストール先を指定して,インストールします.
/usr/local/binにする場合と,/usr/binにする場合があるようで,今回はどのユーザーでも使えるように/usr/binにしました.
php composer-installer.php --filename=composer --install-dir=/usr/bin
インストールできているか確認します.
composer --version
Composer version 2.4.3 2022-10-14 16:56:41
2. PHP Libraryのインストール
まず,自身のサイトのルートディレクトリに移動します.
#自身の環境によって変えてください
cd /var/www/html
公式サイトにあるインストールコマンドを打ちます.
composer require mongodb/mongodb
インストールされたか確認します.
composer show -i
...
jean85/pretty-package-versions 2.0.5 A library to get pretty versions strings of installed dep...
mongodb/mongodb 1.13.1 MongoDB driver library
symfony/polyfill-php80 v1.26.0 Symfony polyfill backporting some PHP 8.0+ features to lo...
PHPからの書き込み/読み込みテスト
では,実際にDriverとLibraryを使ってMongoDBへのInsert/Findを試してみます.
テスト用のPHPを作成します.
<?php
require './vendor/autoload.php';
$collection = (new MongoDB\Client("mongodb://(ユーザー名):(パスワード)@localhost:27017"))->test->users;
$insertOneResult = $collection->insertOne([
'username' => 'admin',
'email' => 'admin@example.com',
'name' => 'Admin User',
]);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());
?>
<?php
require './vendor/autoload.php';
$collection = (new MongoDB\Client("mongodb://(ユーザー名):(パスワード)@localhost:27017"))->test->users;
$document = $collection->findOne(['name' => 'Admin User']);
var_dump($document);
?>
これらを,/var/www/html/に置いて,アクセスしてみます.
test1.php
Inserted 1 document(s) object(MongoDB\BSON\ObjectId)#4 (1) { ["oid"]=> string(24) "635031d090dcd973ee0fa812" }
--
test2.php
object(MongoDB\Model\BSONDocument)#14 (1) { ["storage":"ArrayObject":private]=> array(4) { ["_id"]=> object(MongoDB\BSON\ObjectId)#13 (1) { ["oid"]=> string(24) "635031d090dcd973ee0fa812" } ["username"]=> string(5) "admin" ["email"]=> string(17) "admin@example.com" ["name"]=> string(10) "Admin User" } }
--
それぞれちゃんと動作しているようです.