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初心者なので、以下のページを参考にさせていただきました)
インストール
コマンドライン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
mongod
はCentOSのネイティブサービスじゃないので、systemctl enable
じゃなくて、chkconfig
を使いましょう。
ということですが、ちゃんとリダイレクトしてくれたようです。
では、
$ mongo MongoDB shell version: 3.2.x >
おぉ~動きましたw
ログアウトはexit
orquit()
、或いはCtrl+c
で可能です。
ドライバのインストール(pecl利用)
標準インストールのPHPでは(当然)ドライバがインストールされていませんので、PHP公式の手順に従ってインストールします。
pecl
コマンドを利用するためには、私の環境では以下のライブラリインストールが必要でした。
# yum install openssl-devel gcc php-pear
そして、
# pecl install mongodb
インストールされた、mongodb.so
をphp.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**での開発環境を実現させたのには、ちょっとした訳がありまして、、、そのあたりを次回のネタにしたいと思います。