1. 程式人生 > >那些年,我用Thinkphp5整合mongoDB遇到的坑

那些年,我用Thinkphp5整合mongoDB遇到的坑

據說Thinkphp5可以很方便的整合MongoDB,於是試了一下,結果全是坑啊,於是我就這樣一步一步的踩過來了。

前言

公司的系統升級,需要將核心資料遷移到mongoDB上,同時,我們的開發框架也要升級,之前是ThinkPHP3.2的,現在要用TP5來做開發,於是如何使用TP5來操作MongoDB成為了擺在眼前的難題。也許對有的人而言,這是個比較簡單的問題,但是對於公司的同事而言,這兩個東西都是陌生的,之前都沒有接觸過,所以難免的會出現很多問題。但是為了後續的擴充套件,我們還是毅然決然的踩了下去。果然,踩出了一條坑坑窪窪的泥濘大道。

開始

1)安裝ThinkPHP5

2)安裝MongoDB

3)將MongoDB整合到ThinkPHP5裡面

4)安裝rockmongo,管理mongodb

我本地的環境是windows(32位) + php5.6.27(nts) + apache。

一、安裝ThinkPHP5

ThinkPHP5的安裝方式有很多,也很簡單。我採用的是Git的方式直接從Github克隆的方式。這裡不再贅述。

安裝方式: http://www.kancloud.cn/manual/thinkphp5/118006

二、安裝MongoDB

好吧,從這裡開始,我踏上了一條漫漫踩坑之路。

由於我係統是32位的,無法下載最新的mongodb,只能下載3.2.12版的(當時最新的是3.4),不顧無所謂,能用就行。

下載地址:https://www.mongodb.com/download-center#previous


接著,安裝mongoDB。安裝教程可參考:http://www.runoob.com/mongodb/mongodb-window-install.html

安裝mongo都沒有什麼問題,下一步下一步就可以了。但是, 我在把mongo安裝為系統服務的時候遇到了問題。

mongod.exe --bind_ip yourIPadress --logpath "C:\data\dbConf\mongodb.log" --logappend --dbpath "C:\data\db" --port yourPortNumber --serviceName "YourServiceName" --serviceDisplayName "YourServiceName" --install


服務安裝成功了,但是卻無法啟動,報錯100.

於是去網上找了很多資料,都沒能解決我的問題。直到我看到了這篇文章http://blog.csdn.net/jiadajing267/article/details/54134965

我按照文章中的方法,將mongodb安裝路徑下data檔案中有兩個檔案一個mongod.lock刪除,然後重新試了一下,就ok了。

另外,可能是我環境的原因,我在執行上面的程式碼的時候需要加入兩個引數才可以:--journal --storageEngine mmapv1

總之,搞了半天,mongodb終於安裝成功了。

三、將mongodb整合到thinkphp5中

首先,需要安裝mongo擴充套件。https://s3.amazonaws.com/drivers.mongodb.org/php/index.html。我下載的是最新的。


下載完之後,將php_mongo.dll放到php的ext目錄下,然後在php.ini中加入extension=php_mongo.dll,重啟伺服器(我用的是phpstudy)

用phpinfo檢視,mongo擴充套件安裝成功了。


然後,我在tp5中用mongoClient類調取mongo資料,成功了。程式碼如下:

$m = new \MongoClient();
$db = $m->runoob;
$collection = $db->col;
//dump($collection);
//插入文件$document = array(
    "title" => "MongoDB",
    "description" => "database",
    "likes" => 100,
    "url" => "http://www.runoob.com/mongodb/",
    "by" => "菜鳥教程",
    "likes" => 50
);
//dump($collection->insert($document));
//查詢文件$list = $collection->find();
foreach($list as $v) {
    dump($v);
}

但是,問題來了,我不能在專案中用原生的mongo庫啊,我想能夠將TP5和mongo整合,讓TP5能夠像操作mysql一樣操作mongo,我所需做的只是將database.php中的配置改為mongo的配置就可以了。

我去TP的官網看了下,TP5是支援用composer的方式安裝mongo擴充套件的。http://www.kancloud.cn/manual/thinkphp5/167865

於是,我先安裝composer。安裝composer的過程很多簡單,這裡不再贅述,不會的同學可以直接到https://getcomposer.org/download/去學習安裝方法。有個小插曲是安裝composer的過程中報錯了,原來是我有個擴充套件庫有點問題,我將那個擴充套件庫去掉就可以了。

安裝完composer之後,進入專案根目錄,按照教程執行composer require thinkphp/think-mongo即可。

很簡單吧,誰知道,這才是真正開始的坑啊,讓我費了好久的時間。

因為我在cmd中執行上面的命令,完全沒有反應,過了很久,才報錯。錯誤如下:


沒辦法,去網上找了很多資料,參照改了很多,都沒有用。終於,看到了下面的一篇文章。

http://www.thinkphp.cn/topic/45113.html。裡面說是映象地址錯了的原因。


很有可能就是這個原因,於是參考文章所說,執行命令

composer config repo.packagist composer https://packagist.phpcomposer.com

然後再執行命令composer require thinkphp/think-mongo。

可以了,在vendor目錄下多了兩個目錄


下面,開始整合mongoDB。

1)修改database.php


2)在controller中使用DB庫讀取mongo


哇哈哈哈哈,成功了成功了!

個屁!!!!!

只要配置了database.php,就會報錯

require mongodb > 1.0

可是,我不是安裝了mongodb了嗎?我的mongodb是3.2.14的啊,怎麼還會有這個錯誤。 通過查詢資料,發現,原來這裡的錯誤是因為我沒有安裝mongodb擴充套件造成的。(注意:上面我只安裝了php_mongo.dll,沒有安裝php_mongodb.dll) 可以參考這個資料安裝mongodb擴充套件:http://www.thinkphp.cn/topic/40328.html
安裝完之後,可以運行了。

四、安裝rockmongo

http://www.runoob.com/mongodb/working-with-rockmongo.html

這個很簡單,就跟安裝phpmyadmin一樣的。安裝之後的登入密碼是admin、admin