開発室ブログ

mongoDB PHP

PHPだってもうmongoDBで良いんじゃ・・・

LAMPラブ」な私たちですが、最近、コマ切れにテストアプリを作成する機会が増えました。

所謂 「マイクロサービス化」と同じ流れになってると感じたりします。

マイクロサービスとは?

これはこれで、1記事書けそうなテーマですが、ザックリ言うと、
「サービス全体が独立した小さなサービスの集合で構成される」と解釈してます。

具体例はググって頂くとして、、、 私たちの場合だと、

  • 既に運用中のサービスの機能追加を行う事を前提として、まずはその機能が単体サービスとして動作するアプリ開発を行う
  • 既に運用中のサービスの機能を、一旦分離独立させて、単体サービスとして提供できるようにする
  • それら単体サービスを、運用中のサービスに組み込む

といったアプローチを採ることが多いです(厳密には「マイクロサービス」とは言えないのかもしれませんけど)。

機能の一つ一つを「API化」して行き、それを束ねるものを「プラットフォーム化」して行く~という流れになります。

機が熟せばその「プラットフォーム」はサービス化する「予定」なのですが、開発段階からリリース時を想定したインフラ構築は難しくなります。
また、サービスのスケールやリアクションの見込みがシミュレーション出来たとしても、それやっていてはキックオフまでのタイムロスが発生しがちになり、開発速度の向上は望めません。

そこで、** 開発環境をもっと簡単に構築できんものか? **と、考えるわけですが、私たちのセクションにはインフラ専従者という者がおりませんので、プログラマ達がその辺を創意工夫しなければならないと思ってます。

「そんなもん『慣れ』の問題だし、どうせマッサラなサーバだったとしても、yumしか使わんのだろ?」といった突っ込みもありそうですが、RDBMSって権限の設定等が簡単ではないんですよね・・・MySQLだとgrant構文とかね・・・プログラマはそんなの覚えちゃいません(汗)。
インフラ構築が得意ではないプログラマが、サクっとコードを書き始める事ができる~ということが、弱小ベンダーではありがたい訳で・・・

PHPでmongoDB?

話が開発手法側に流れそうになりましたが、本題は PHPでmongoDB」 です。

設計・設定が面倒なMySQLの代わりに、立ち上がり容易(速い)なNoSQLを使って、コードを書き始めちゃおう!
という趣旨により、mongoDBに白羽の矢を立てました(笑)。

mongoDBにはMySQL代替としてみた場合、以下の点にメリット・デメリットがあります。

メリット

  • yumだけで使えるようになる(PHPで使うには、さらに手順があるので語弊がありますが・・・)
  • スキーマレスなので、カラムを自由に定義することができる
  • SQL文不要(覚える必要ない)
  • INSERTが爆速
  • WHERE句の代わりにjavascriptで条件を書ける

デメリット

  • SELECTがイメージほどほど速くない
  • JOIN句が使えない(Ver3.2~$lookupが追加され、「それっぽい」事は一応可能)
  • トランザクション機能が無い
  • 複数台構成に向かない

レコードロックについては「不可能」だと認識してたのですが、特定の条件で可能なようです。
(斯く言う私もmongoDB初心者なので、以下のページを参考にさせていただきました)

MongoDB 3のWired Tigerを使うとうれしいこと – Qiita

インストール

コマンドラインPHPでmongoDBを利用するまでの手順を紹介します(CentOS7の場合)

リポジトリの登録

新規に.repoファイルを作成します。

# vi /etc/yum.repos.d/mongodb-org-3.4.repo

中身はこんな感じ。

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

んで、yumでインストール。

# yum install mongodb-org

起動

# systemctl start mongod

停止

# systemctl stop mongod

自動起動設定

システムをリブートしたときにMongoDBを自動的に起動させる。

# systemctl enable mongod

ありゃ、

mongod.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mongod on

mongodCentOSのネイティブサービスじゃないので、systemctl enableじゃなくて、chkconfigを使いましょう。
ということですが、ちゃんとリダイレクトしてくれたようです。

では、

$ mongo
MongoDB shell version: 3.2.x
>

おぉ~動きましたw

ログアウトはexitorquit()、或いはCtrl+cで可能です。

ドライバのインストール(pecl利用)

標準インストールのPHPでは(当然)ドライバがインストールされていませんので、PHP公式の手順に従ってインストールします。
peclコマンドを利用するためには、私の環境では以下のライブラリインストールが必要でした。

# yum install openssl-devel gcc php-pear

そして、

# pecl install mongodb

インストールされた、mongodb.sophp.iniのextensionに登録します。
|| php.ini ||

~
extension=mongodb.so
~

Apacheを再起動し、

# service httpd restart

phpinfo()にmongodbの情報が表示されていれば成功!
例)

# php info.php | grep -e mongo*
~
mongodb
libmongoc bundled version => 1.5.5
~

ライブラリのインストール(composer利用)

# composer require mongodb/mongodb

因みに私は、composer.jsonを定義・編集してから、composer updateするやり方が好きですw

ここまでで、インストール作業は終了です!

以下はPHP公式を参考にしたサンプルコードです。

|| sample.php ||

<?php
require 'vendor/autoload.php'; // include Composer's autoloader
$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->beers;
$result = $collection->find( [ 'category' => 'ale' ] );
header('content-type: application/json; charset=utf-8');
echo json_encode( $result );

このファイルを実行すれば、エールビールの銘柄がjsonで返ってくる~という事になりますね。

利用範囲

よーく考えれば考えるほど利用範囲が狭い** PHPでmongoDB**での開発環境を実現させたのには、ちょっとした訳がありまして、、、そのあたりを次回のネタにしたいと思います。

参考にさせていただいたサイト

RecentPost