Ostatnio interesowałem się dość mocno optymalizacją prędkości pracy witryn internetowych. Testowałem rożne bazy NoSQL, które zamiast przechowywać wpisy w formacie SQL czyli tabele rekordy itp. używają dokumentów. Znaczącą przewagą takich baz jest fakt iż struktura bazy jest bardzo elastyczna. Nie mamy jednak dostępu do wielu przydatnych funkcji SQL takich jak transakcje, relacje itp. Zamiast tego dostajemy bardzo szybki mechanizm do pobierania i zapisywania danych. Trafiłem na bazę MongoDB, która przechowuje dane w formie JSON-ów. Przykładowy benchmark mysql vs mongodb

wybór 5000 rekordów z bazy 10 milionów wierszy

INSERT:
Mongo: ilość wątków: 1, czas wykonania 411121 ms, obciązenie cpu 137%
Mysql: ilość wątków: 8, czas wykonania 1130493 ms, obciązenie cpu 149%

SELECT i FETCH:
Mongo: ilość wątków: 1, czas wykonania 3ms, obciązenie cpu 105%
Mysql: ilość wątków: 8, czas wykonania 5369 ms, obciązenie cpu 109%
Benchmarków jest bardzo dużo, ale przy ogromnych bazach danych wybór rekordów MongoDb jest o wiele szybszy.

Dokładniejszy benchmark znajdziecie tutaj

Jak użyć mongo w PHP?

Najprostszym sposobem jest dodanie rozszerzenia mongo pełny opis znajduje się pod adresem http://php.net/manual/en/mongo.installation.php

Następnie należy odpalić bazę jako usługę lub jako program. Podać ścieżkę gdzie ma zapisywać pliki z strukturą i tyle. Nie musimy definiować struktury bazy danych, mongo samo ją utworzy na podstawie danych, które przekazujemy do bazy.

aby utworzyc klienta wystarczy napisać

$mongoDb = new MongoClient();

lub

$users = $m->selectCollection("cms", "users");

w zależności od wersji PECL.
Przykład wyboru kolekcji users z bazy CMS

$users = $m->selectCollection("cms", "users");

dodanie użytkownika

$document = array( "name" => "Robert", "position" => "PHP Developer" );
$users ->insert($document);

 

szukanie w kolekcji

$usersRepository = $users->find();

foreach ($usersRepository as $u) {
    echo $u["name"] . "\n";
}

Bardziej szczegółowy opis znajdziecie na

http://php.net/manual/en/mongo.tutorial.php

Przejdę teraz do ODM, który standaryzuje pracę z MongoDb.

Mandango ODM

Mandango ODM jest szybkim, prostym bardzo przydatnym ODM-em dla PHP i MongoDB.
ODM jest narzędziem, które mapuje strukturę dokumentowej bazy na obiekty w PHP

Mandango umożliwa przechowywanie relacji do dokumentów, referencji, zagnieżdzonych dokumentów, zawiera wsparcie dla indeksów i wiele innych ciekawych funkcji. Więcej na http://mandango.org/

Aby zainstalować Mandango pobierz z GIT-a lub przez composera paczkę http://github.com/mandango/mandango

Aby zainstalować ODM przejrzyj dokumentację http://mandango.org/doc/ pod tym adresem. Z moich uwag w przypadku instalacji mandago przez composera w pliku composer.json dodaj

{
    "require": {
        "mandango/mondator" : "1.0.*@dev",
        "mandango/mandango": "1.0.*@dev"
    },
    "autoload": {
        "psr-4": {
            "Mandango\\Mondator\\": "/vendor/mandango/mondator/src",
            "Mandango\\" : "/vendor/mandango/mandango/src",
            "Model\\" : "./Model"
        }
    }
}

i zrób composer install