Posted at

PHP5系から7系に移行するにあたりmongodb周りでやったこと


はじめに

PHP5系から7系に移行する際に、mongoのドライバーを変更する必要があったためそれ関連のTipsです。

対応してから日にち経っており忘れかけているので間違い等ありましたらご指摘お願いします。

PHP Version : 5.5 → 7.2


前提知識

mongo周り詳しくないため、右往左往しました。

同じような方もいらっしゃるかなと思い、簡単にPHPのmongo周りをまとめます。

PHP5でmongoDBを使う場合は、peclでmongo extensionというエクステンションを利用していました。

但し、mongo extensionはPHP5で止まっており、PHP7では使えません。

PHP7でmongoDBを使う場合は、mongodb extensionというエクステンションを使うことになります。

また、mongodb extensionでは、composerのmongodbライブラリが使えるため、一緒に利用するのが良いです。

mongoドライバー関連のドキュメント(英語)

mongo extensionmongodb extensionの互換性を提供するパッケージもある見たいですので、使えるかもです。(使ってない)

互換性パッケージ


インストール

PHPマニュアルのインストールに従えば大丈夫だと思います。

http://php.net/manual/ja/set.mongodb.php

sudo pecl install mongodb


php.ini

extension=mongodb.so



ハマりかけたとこ

ドライバーも入れたし、PHPアプリケーションとmongoの疎通確認をしようと思い下記スクリプトを用意しました。

<?php

$tmp = new \MongoDB\Driver\Manager("mongodb://localhost:27017");
var_dump($tmp);

/* Output
class MongoDB\Driver\Manager#1 (2) {
public $uri =>
string(25) "mongodb://localhost:27017"
public $cluster =>
array(0) {
}
}
*/

空っぽのオブジェクトが返されて、よくわからん:anguished:

考えていても進まないので、追加でcomposer経由でmongodbライブラリを導入しました。


mongoライブラリを導入


composer require mongodb/mongodb

<?php

require 'vendor/autoload.php';

$client = new MongoDB\Client("mongodb://localhost:27017");

とりあえずmongoDBとの疎通確認。

見た感じ繋がっていたので、よし!

使い方等は下記を参考。

PHP Library Manual


旧ドライバとmongoライブラリの差異周り

同名で同機能のメソッドが大抵は提供されているため全部取り替える必要はなかったのですが、一部書き換えが発生し面倒でした。

今回は影響箇所が少なかったため力技で書き換えましたが、影響範囲が広い場合は互換性パッケージの利用を検討した方が良いかもです。

mongo extensionからMongoDB PHP Libraryへのアップグレードガイドがあるので、一読しておくと良いかもしません。

(後で気づきましたがアップグレードガイドの「Old and New Methods」項目に新旧メソッドの対応表書いてあるため必読です。)

アップグレードガイド

以下、今回の対応で差異があったもの。


saveメソッドが廃止

peclのmongoのMongoCollectionクラスには、saveメソッドが用意されており、既存のデータがあれば更新、なければ追加みたいに追加・更新を意識せずに使えていました。

saveメソッドが廃止されたので、insertとupdateを意識して分ける必要があります。


removeメソッドも廃止

コレクションのドキュメントを一気に消す際に使われていましたが、廃止になりました。

deleteOneやdeleteManyで頑張って消しましょう。