WSL (Ubuntu 16.04 TLS) 内で、PHP から MongoDB を操作するための環境を作ります。
「PHP から MongoDB を操作してみる」が目的であるため、ウェブサーバーとしては、Apache や nginx は使わず PHP のビルトインサーバーを使います。
目次
1. 環境
- WSL (Ubuntu 16.04 TLS)
2. PHP から MongoDB を使うための作業
1. MongoDB をインストールする
以下のページに従って、MongoDB 公式パッケージをインストールします。
2. PHP をインストールする
以下のページに従って、PHP 7.2 をインストールします。
3. PHP の MongoDB driver をインストールする
PHP から MongoDB を操作するために専用のドライバをインストールする必要があります。
このドライバーのインストールには、pecl
コマンドを使用するため、まず php7.2-dev パッケージをインストールします。
$ sudo apt install php7.2-dev
これで、pecl
コマンドが使えるようになったはずです。
※ PHP 7.0 の場合は、php-dev
もしくは php7.0-dev
というパッケージ名だと思います。後ろに “-dev” がついたパッケージです。
そして、MongoDB のドライバをインストールします。
$ sudo pecl install mongodb
(省略)
Build process completed successfully
Installing '/usr/lib/php/20170718/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.5.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
/usr/lib/php/20170718/mongodb.so
ファイルが生成されました。このモジュールファイルがドライバとなっています。
mongodb.so
ファイルのパーミッションを変更しておきます。
$ sudo chmod a+r /usr/lib/php/20170718/mongodb.so
/etc/php/7.2/cli/php.ini ファイルに以下を追記します。
extension=mongodb.so
mongodb モジュールが組み込まれたことを確認します。
$ php -m | grep mongo
mongodb
“mongodb” と出力されればOKです。
参考
3. PHP から MongoDB を使ってみる
ここでは、Composer を使って導入することができる mongodb/mongodb という MongoDB用ライブラリを使います。
Composer については、以下を参考にしてください。
データの準備
予め MongoDB にデータを追加しておきます。
そのため、まずは MongoDB のサーバーを起動します。
$ mongod --fork --config /etc/mongod.conf
CLI のクライアントプログラムを実行し、MongoDB サーバー上のデータを操作します。
$ mongo
ここでは、”demo” というデータベースを使います。
> use demo
以下を貼り付けて、”unicorns” というコレクションにドキュメント(データ)を追加します。
db.unicorns.insert({name: 'Horny', dob: new Date(1992,2,13,7,47)});
db.unicorns.insert({name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0)});
これでデータの準備は OK です。
PHP のプログラムを書く
作業を行うためのディレクトリを作成し、その中に移動します。
$ mkdir -p ~/work/php-mongodb-test
$ cd ~/work/php-mongodb-test
Composer で mongodb/mongodb をインストールします。
$ composer require mongodb/mongodb
次に、index.php
ファイルを作成します。
このPHPファイルの中では、先程準備したコレクションに新たにドキュメント(データ)を追加し、既に追加済であったものとまとめて取得して画面に出力しています。
<?php
require 'vendor/autoload.php'; // include Composer's autoloader
// エラーを例外に変換する
function exception_error_handler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
// このエラーコードが error_reporting に含まれていない場合
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");
// HTMLエスケープ関数
function e($html) {
return htmlspecialchars($html, ENT_QUOTES);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHP x MongoDB Test</title>
</head>
<body>
<h1>PHP x MongoDB Test</h1>
<?php
try {
$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->unicorns;
$result = $collection->insertOne( [
'name' => 'Unicorn',
'dob' => new MongoDB\BSON\UTCDateTime(),
'loves' => ['energon', 'redbull'],
'weight' => 984
] );
$result = $collection->find();
foreach ($result as $entry) {
$datetime = '';
if (isset($entry['dob'])) {
$datetime = $entry['dob']->toDateTime()->format('Y年m月d日');
}
echo e($entry['_id']), ': ', e($entry['name']), ', ', e($datetime), '
';
}
} catch (Exception $e) {
echo '<h2>例外発生</h2>';
var_dump($e->getMessage());
}
?>
</body>
</html>
PHPのビルトインサーバー(Webサーバー)を起動します。
$ php -S localhost:8000 -t .