那些年,我用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