為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
MongoDB是一個開源的NoSQL(非關聯型)數據庫管理系統,通常縮寫為Mongo。它以橫向擴展能力、靈活的數據模型和高性能而聞名,特別適合處理大量的非結構化或半結構化數據,基本的MongoDB特點,可以透過ChatGPT解釋幫助理解。
總體來說,MongoDB是一個多用途、高性能的數據庫系統,特別適合處理大量的非結構化或半結構化數據,並且在Web應用程序、移動應用程序、物聯網和大數據等領域中廣泛應用。它的簡單語法和靈活性使開發人員能夠迅速開發應用程序,而且它可以根據應用程序的需求輕松擴展。
接下來要來配置Mongo,這邊會使用官方建議套件mongodb/laravel-mongodb來實作,而在安裝前根據說明文件,需要先安裝 MongoDB PHP 擴展的支持,如果是使用docker容器的話,就要額外編寫dockerfile
增加安裝 MongoDB PHP 擴展及mongoDB image,並在config/database.php
增加mongo設定檔。
首先先修正docker-compose.yml
,增加mongo的設定
接著根據說明文件規定,安裝 MongoDB PHP 擴展的支持,編寫dockerfile
//安裝 MongoDB PHP 擴展
RUN pecl install mongodb
RUN docker-php-ext-enable mongodb
接著測試連接mongo容器,確認mongo有設定成功。
docker exec -it {your_container_name} bash
接著進到mongo shell 新增DB跟insert一筆資料看看結果,而當你mongo版本太高,輸入 mongo會遇到以下狀況,這邊可以參考這篇文章解決方案以mongosh
進入,如果要查看image版本,可以輸入下列指令。
// 查看image 版本
docker images mongo
// 進入mongo shell with db 帳號密碼
mongosh --host localhost:27017 -u {your_account} -p
正確進入後會看到這個畫面,接著我們可以使用下列指令新增DB跟資料
//切換db or create new db
use tests
//塞入一筆資料
db.posts.insertOne({
title: "Post Title 1",
body: "Body of post.",
category: "News",
likes: 1,
tags: ["news", "events"],
date: Date()
})
確認mongo GUI工具,有正常看到此筆新增資料
這邊使用mongodb/laravel-mongodb 套件安裝,並配置相關Laravel設定,先執行composer 安裝指令。
composer require mongodb/laravel-mongodb
安裝完畢且確定容器mongo都能正常執行資料,接下來要開始設定DB與Laravel專案連接,首先先配置database.php
及環境變數.env
的設定。
MONGO_HOST=app_mongodb
MONGO_DATABASE=demo
MONGO_USERNAME=test
MONGO_PASSWORD=password
創建Mongo migration table,創建完畢後需要使用mongodb/laravel-mongodb
套件功能來幫助我們新增table欄位,且透過createAt
設定ttl索引。
註:根據 MongoDB 6.3 開始,MongoDB 可以使用TTL 索引,它在一段時間後或在特定時鐘時間自動從集合中刪除文件,詳細可查看相關文檔。
php artisan make:migration create_collection_log_record
這時候創建完執行migrate會出現以下問題
The SCRAM_SHA_256 authentication mechanism requires libmongoc built with ENABLE_SSL
這問題主要是建置時未完整安裝 SSL 函式庫(例如libssl-dev),這邊可以透過以下指令來查看擴展
php -i | grep -i mongo
這是缺乏擴展
root@8dbdb24198c7:/var/www/html# php -i | grep -i mongo
/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini,
mongodb
MongoDB support => enabled
MongoDB extension version => 1.16.2
MongoDB extension stability => stable
libmongoc bundled version => 1.24.3
libmongoc SSL => disabled
libmongoc crypto => disabled
libmongoc SASL => disabled
libmongoc ICU => disabled
libmongoc compression => enabled
libmongoc compression snappy => disabled
libmongoc compression zlib => enabled
libmongoc compression zstd => disabled
libmongocrypt => disabled
mongodb.debug => no value => no value
這是補全libssl-dev擴展
root@104e5e4e238e:/var/www/html# php -i | grep -i mongo
/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini,
mongodb
MongoDB support => enabled
MongoDB extension version => 1.16.2
MongoDB extension stability => stable
libmongoc bundled version => 1.24.3
libmongoc SSL => enabled
libmongoc SSL library => OpenSSL
libmongoc crypto => enabled
libmongoc crypto library => libcrypto
libmongoc crypto system profile => disabled
libmongoc SASL => disabled
libmongoc ICU => disabled
libmongoc compression => enabled
libmongoc compression snappy => disabled
libmongoc compression zlib => enabled
libmongoc compression zstd => disabled
libmongocrypt bundled version => 1.8.1
libmongocrypt crypto => enabled
libmongocrypt crypto library => libcrypto
mongodb.debug => no value => no value
接著我們要在dockerfile
增加額外擴展,以便可以順利創建migrate,增加以下條件後,需要重新build docker
RUN apt-get install -y libmongoc-1.0-0 libssl-dev
執行migrate,確定laravel對於資料庫連接都正常執行了
接著要來設定Model 並且撰寫登入log紀錄的儲存,確認執行正常,創建Model並配置相關設定,正常是編寫一個專門用來記錄logger的Service,但這邊求快,先寫在登入邏輯裡
php artisan make:model LogRecord
在登入功能裡增加log紀錄,接著測試操作執行確認資料有正常寫入mongoDB
以上是整個配置流程及踩到的坑,比較麻煩的部分大概就是php版本對應的mongo版本的擴展比較容易有衝突,最後附上查詢相關文件連結。
Set Up to Run PHP with MongoDB
https://stackoverflow.com/questions/58680158/install-mongodb-driver-in-docker-with-dockerfile
https://github.com/doctrine/DoctrineMongoDBBundle/issues/450
https://github.com/docker-library/php/issues/374