Laravel 配置使用 MongoDB 資料庫

2023/10/15閱讀時間約 10 分鐘

為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。

關於MongoDB?

MongoDB是一個開源的NoSQL(非關聯型)數據庫管理系統,通常縮寫為Mongo。它以橫向擴展能力、靈活的數據模型和高性能而聞名,特別適合處理大量的非結構化或半結構化數據,基本的MongoDB特點,可以透過ChatGPT解釋幫助理解。

總體來說,MongoDB是一個多用途、高性能的數據庫系統,特別適合處理大量的非結構化或半結構化數據,並且在Web應用程序、移動應用程序、物聯網和大數據等領域中廣泛應用。它的簡單語法和靈活性使開發人員能夠迅速開發應用程序,而且它可以根據應用程序的需求輕松擴展。

設定Mongo

接下來要來配置Mongo,這邊會使用官方建議套件mongodb/laravel-mongodb來實作,而在安裝前根據說明文件,需要先安裝 MongoDB PHP 擴展的支持,如果是使用docker容器的話,就要額外編寫dockerfile增加安裝 MongoDB PHP 擴展及mongoDB image,並在config/database.php增加mongo設定檔。

首先先修正docker-compose.yml,增加mongo的設定

raw-image

接著根據說明文件規定,安裝 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版本,可以輸入下列指令。

raw-image
// 查看image 版本
docker images mongo
// 進入mongo shell​ with db 帳號密碼
mongosh --host localhost:27017 -u {your_account} -p

正確進入後會看到這個畫面,接著我們可以使用下列指令新增DB跟資料

raw-image
//切換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()
})
raw-image

確認mongo GUI工具,有正常看到此筆新增資料

raw-image

設置 Laravel

這邊使用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
raw-image

創建Mongo migration table,創建完畢後需要使用mongodb/laravel-mongodb套件功能來幫助我們新增table欄位,且透過createAt設定ttl索引。

註:根據 MongoDB 6.3 開始,MongoDB 可以使用TTL 索引,它在一段時間後或在特定時鐘時間自動從集合中刪除文件,詳細可查看相關文檔

php artisan make:migration create_collection_log_record
raw-image

這時候創建完執行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對於資料庫連接都正常執行了

raw-image
raw-image

實作邏輯

接著要來設定Model 並且撰寫登入log紀錄的儲存,確認執行正常,創建Model並配置相關設定,正常是編寫一個專門用來記錄logger的Service,但這邊求快,先寫在登入邏輯裡

php artisan make:model LogRecord
raw-image

在登入功能裡增加log紀錄,接著測試操作執行確認資料有正常寫入mongoDB

raw-image
raw-image

以上是整個配置流程及踩到的坑,比較麻煩的部分大概就是php版本對應的mongo版本的擴展比較容易有衝突,最後附上查詢相關文件連結。


Set Up to Run PHP with MongoDB

https://stackoverflow.com/questions/58680158/install-mongodb-driver-in-docker-with-dockerfile

mongodb.installation.pecl.php

https://github.com/doctrine/DoctrineMongoDBBundle/issues/450

https://github.com/docker-library/php/issues/374

https://stackoverflow.com/questions/49894623/why-docker-php-ext-install-does-not-contains-some-extensions-and-has-it-advanta



13會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
發表第一個留言支持創作者!