AlmaLinux9 + PHP7.4でMongoDBを使う(初期設定及び使い方)

# はじめに

[MongoDBの公式サイト](https://www.mongodb.com/docs/drivers/php/)に書かれている内容を実際に試してみました．
* MongoDB PHP Driver(mongodb-1.14.1)の導入
* MongoDB PHP Library(mongodb-php-library-1.13)の導入
* PHPから実際に書き込み／読み込み

なお，以下の記事の通り，AlmaLinux9にMongoDBをインストール済みの状態を前提とします．

https://qiita.com/THaruka/items/a8376c089f1b70277b75

また，以下の記事を参考にLAMP環境を構築済みの状態です．

https://qiita.com/heimaru1231/items/3786e6a2b0d548bd76f1

### 前提条件
* AlmaLinux 9.0
* Apache 2.4.51
* PHP 7.4.32
* MongoDB 6.0.2

## MongoDB PHP Driverの導入
### 1. 必要なライブラリのインストール
後々要求されるので，必要なライブラリをあらかじめ入れておきます．
調べた限り，環境によっては他にも色々要求されることがあるみたいです．
```bash
sudo dnf install php-devel php-pear
```

### 2. peclでインストール
公式に書いてある通り，peclを用いてドライバーのインストールをします．
```bash
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
```
```ini:php.ini
#最終行に加筆
extension = mongodb.so
```
加筆したら，apacheとphpを再起動しておきます．
```bash
sudo systemctl restart httpd
sudo systemctl restart php-fpm
```

## PHP Liblaryの導入
### 1. Composerのインストール
composerのインストール方法はいくつかあるみたいですが，今回はwgetを使う方法でやってみます．

wgetが無い場合は，あらかじめインストールしておきます．
```bash
sudo dnf install -y wget
```
composerのインストーラーをwgetを使ってとってきます．
```bash
wget https://getcomposer.org/installer -O composer-installer.php
```
インストール先を指定して，インストールします．
/usr/local/binにする場合と，/usr/binにする場合があるようで，今回はどのユーザーでも使えるように/usr/binにしました．

```bash
php composer-installer.php --filename=composer --install-dir=/usr/bin
```
インストールできているか確認します．
```bash
composer --version

Composer version 2.4.3 2022-10-14 16:56:41
```

### 2. PHP Libraryのインストール
まず，自身のサイトのルートディレクトリに移動します．
```bash
#自身の環境によって変えてください
cd /var/www/html
```
公式サイトにあるインストールコマンドを打ちます．
```bash
composer require mongodb/mongodb
```
インストールされたか確認します．
```bash
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:test1.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:test2.php
<?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" } }
--
それぞれちゃんと動作しているようです．