MAMP: MongoDB-Unterstützung hinzufügen

Um mit einer MongoDB kommunizieren zu können, benötigen wir eine entsprechende Schnittstelle aus PHP heraus. Wie diese eingerichtet wird kann man hier nachlesen. Die Informationen dort sind allerdings sehr rudimentär – also möchte ich hier etwas mehr ins Detail gehen.

In meiner Testumgebung (MAMP) nutze ich PHP 5.4.4. Damit PECL genutzt werden kann, müssen allerdings noch einige Vorkehrungen getroffen werden:

Als erstes müssen die „MAMP Serverkomponenten und Bibliotheken / MAMP Server components and libraries“ geladen werden (ca. 150MB). Diese werden im Downloadbereich bereitgestellt. Aus dem geladenen Paket braucht man allerdings nur die Qullen von PHP in der entsprechenden Version.

Alternativ kann man die nötigen Quellen auch von der offiziellen PHP-Seite herunterladen. Die geladenen Qullen müssen in in ein Include-Verzeichnis unter PHP entpackt werden:

cd /Applications/MAMP/bin/php/php5.4.4/
mkdir include

Nun sollte die Verzeichnisstruktur so aussehen (man achte auf include/php):

.
├── bin
│   ├── pear
│   ├── peardev
│   ├── pecl
│   ├── phar > /Applications/MAMP/bin/php/php5.4.4/bin/phar.phar
│   ├── phar.phar
│   ├── php
│   ├── php-cgi
│   ├── php-config
│   └── phpize
├── conf
│   ├── pear.conf
│   ├── php.ini
│   └── php.ini.temp
├── include
│   └── php
├── lib
│   └── php
└── modules
 └── libphp5.so

Danach wechseln wir in das entsprechende Verzeichnis und rufen configureauf.

cd /Applications/MAMP/bin/php/php5.4.4/include/php/
./configure

Nun können wir PECL nutzen und die MongoDB-Erweiterung hinzufügen:

cd /Applications/MAMP/bin/php/php5.4.4/bin
./pecl install mongo

Falls man folgende Meldung bekommt, muss man autoconf installieren.

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
ERROR: `phpize' failed

Ich habe gehört, dass Xcode die Autotools eigentlich mitbringt – sollte es dennoch (wie bei mir) zu einem Fehler kommen, muss autoconf nachinstalliert werden. Das geht am einfachsten per brew:

brew install autoconf

Danach muss man die oben genannten Befehle erneut ausführen und sollte nach ein bis zwei Minuten folgende Meldung erhalten:

Build process completed successfully
Installing '/Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525/mongo.so'
install ok: channel://pecl.php.net/mongo-1.3.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongo.so" to php.ini

Geschafft! Also prüfen wir, ob die Extrension erfolgreich kompiliert wurde indem wir in das Zielverzeichnis schauen. Dieses befindet sich in meinem Fall hier (Datum im Pfad kann abweichen):

/Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525

Alles was wir nun noch tun müssen, ist die Erweiterung in die php.ini aufzunehmen (wie uns bereits in der letzten Meldung schon vorgeschlagen wurde). Dafür öffnen wir die entsprechende php.ini (welche Konfiguration genutzt wird, kann ganz einfach per phpinfo() überprüft werden). Im gleichen Zuge können wir prüfen, ob das Verzeichnis für die Erweiterungen richtig konfiguriert ist (und ob dort auch unsere neue mongo.so-Erweiterung liegt).

extension_dir = "/Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525/"

Nun fügen wir folgende Zeile ein (im Idealfall an das Ende der Extension-Liste – generell ist die Position aber egal):

; Extensions
extension=mongo.so

Nun muss der Apache einmal neu gestartet werden um die Änderung wirksam zu machen. Um mit der neuen noSQL-Datenbank etwas vertraut zu werden, bietet sich ein Tutorial auf php.net an. Dazu öffnet man das Terminal und führt den Befehl mongod aus (man achte auf das D am Ende – ohne D startet man den Client!).

Der folgende PHP-Code hat bei mir ohne Probleme funktioniert (aus dem genannten Tutorial entnommen):

$connection = new MongoClient();
$db = $connection->testdb;

// select a collection:
$collection = $db->foobar;

$doc = array(
 "name" => "MongoDB",
 "type" => "database",
 "count" => 1,
 "info" => (object)array( "x" => 203, "y" => 102),
 "versions" => array("0.9.7", "0.9.8", "0.9.9")
);

$collection->insert( $doc );

$document = $collection->findOne();
var_dump( $document );

Beitrag veröffentlicht

in

, , , , , , , ,

von

Schlagwörter: