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 );