@@ -223,6 +223,7 @@ Store Scope Blocking Expiring
223223============================================ ====== ======== ========
224224:ref: `FlockStore <lock-store-flock >` local yes no
225225:ref: `MemcachedStore <lock-store-memcached >` remote no yes
226+ :ref: `MongoDbStore <lock-store-mongodb >` remote no yes
226227:ref: `PdoStore <lock-store-pdo >` remote no yes
227228:ref: `RedisStore <lock-store-redis >` remote no yes
228229:ref: `SemaphoreStore <lock-store-semaphore >` local yes no
@@ -275,6 +276,39 @@ support blocking, and expects a TTL to avoid stalled locks::
275276
276277 Memcached does not support TTL lower than 1 second.
277278
279+ .. _lock-store-mongodb :
280+
281+ MongoDbStore
282+ ~~~~~~~~~~~~
283+
284+ .. versionadded :: 4.4
285+
286+ The ``MongoDbStore `` was introduced in Symfony 4.4.
287+
288+ The MongoDbStore saves locks on a MongoDB server, it requires a
289+ ``\MongoDB\Client `` connection from `mongodb/mongodb `_. This store does not
290+ support blocking and expects a TTL to avoid stalled locks::
291+
292+ use Symfony\Component\Lock\Store\MongoDbStore;
293+
294+ $mongoClient = new \MongoDB\Client('mongo://localhost/');
295+
296+ $options = [
297+ 'database' => 'my-app',
298+ ];
299+
300+ $store = new MongoDbStore($mongoClient, $options);
301+
302+ The ``MongoDbStore `` takes the following ``$options ``:
303+
304+ ============ ========= ========================================================================
305+ Option Default Description
306+ ============ ========= ========================================================================
307+ database The name of the database [Mandatory]
308+ collection ``lock `` The name of the collection
309+ gcProbablity ``0.001 `` Should a TTL Index be created expressed as a probability from 0.0 to 1.0
310+ ============ ========= ========================================================================
311+
278312.. _lock-store-pdo :
279313
280314PdoStore
@@ -411,7 +445,7 @@ Remote Stores
411445~~~~~~~~~~~~~
412446
413447Remote stores (:ref: `MemcachedStore <lock-store-memcached >`,
414- :ref: `PdoStore <lock-store-pdo >`,
448+ :ref: `MongoDbStore < lock-store-mongodb >`, :ref: ` PdoStore <lock-store-pdo >`,
415449:ref: `RedisStore <lock-store-redis >` and
416450:ref: `ZookeeperStore <lock-store-zookeeper >`) use a unique token to recognize
417451the true owner of the lock. This token is stored in the
@@ -436,7 +470,7 @@ Expiring Stores
436470~~~~~~~~~~~~~~~
437471
438472Expiring stores (:ref: `MemcachedStore <lock-store-memcached >`,
439- :ref: `PdoStore <lock-store-pdo >` and
473+ :ref: `MongoDbStore < lock-store-mongodb >`, :ref: ` PdoStore <lock-store-pdo >` and
440474:ref: `RedisStore <lock-store-redis >`)
441475guarantee that the lock is acquired only for the defined duration of time. If
442476the task takes longer to be accomplished, then the lock can be released by the
@@ -554,6 +588,46 @@ method uses the Memcached's ``flush()`` method which purges and removes everythi
554588 The method ``flush() `` must not be called, or locks should be stored in a
555589 dedicated Memcached service away from Cache.
556590
591+ MongoDbStore
592+ ~~~~~~~~~~~~
593+
594+ .. caution ::
595+
596+ The locked resource name is indexed in the ``_id `` field of the lock
597+ collection. Beware that in MongoDB an indexed field's value can be
598+ `a maximum of 1024 bytes in length `_ inclusive of structural overhead.
599+
600+ A TTL index MUST BE used on MongoDB 2.2+ to automatically clean up expired locks.
601+ Such an index can be created manually:
602+
603+ .. code-block :: javascript
604+
605+ db .lock .ensureIndex (
606+ { " expires_at" : 1 },
607+ { " expireAfterSeconds" : 0 }
608+ )
609+
610+ Alternatively, the method ``MongoDbStore::createTtlIndex(int $expireAfterSeconds = 0) ``
611+ can be called once to create the TTL index during database setup. Read more
612+ about `Expire Data from Collections by Setting TTL `_ in MongoDB.
613+
614+ .. tip ::
615+
616+ ``MongoDbStore `` will attempt to automatically create a TTL index on MongoDB
617+ 2.2+. It's recommended to set constructor option ``gcProbablity = 0.0 `` to
618+ disable this behavior if you have manually dealt with TTL index creation.
619+
620+ .. caution ::
621+
622+ This store relies on all PHP application and database nodes to have
623+ synchronized clocks for lock expiry to occur at the correct time. To ensure
624+ locks don't expire prematurely; the lock TTL should be set with enough extra
625+ time in ``expireAfterSeconds `` to account for any clock drift between nodes.
626+
627+ ``writeConcern ``, ``readConcern `` and ``readPreference `` are not specified by
628+ MongoDbStore meaning the collection's settings will take effect. Read more
629+ about `Replica Set Read and Write Semantics `_ in MongoDB.
630+
557631PdoStore
558632~~~~~~~~~~
559633
@@ -672,10 +746,14 @@ instance, during the deployment of a new version. Processes with new
672746configuration must not be started while old processes with old configuration
673747are still running.
674748
749+ .. _`a maximum of 1024 bytes in length` : https://docs.mongodb.com/manual/reference/limits/#Index-Key-Limit
675750.. _`ACID` : https://en.wikipedia.org/wiki/ACID
751+ .. _`Data Source Name (DSN)` : https://en.wikipedia.org/wiki/Data_source_name
752+ .. _`Doctrine DBAL Connection` : https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection.php
753+ .. _`Expire Data from Collections by Setting TTL` : https://docs.mongodb.com/manual/tutorial/expire-data/
676754.. _`locks` : https://en.wikipedia.org/wiki/Lock_(computer_science)
677- .. _`PHP semaphore functions ` : https://php.net/manual/en/book.sem.php
755+ .. _`mongodb/mongodb ` : https://packagist.org/packages/mongodb/mongodb
678756.. _`PDO` : https://php.net/pdo
679- .. _`Doctrine DBAL Connection ` : https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Connection .php
680- .. _`Data Source Name (DSN) ` : https://en.wikipedia.org/wiki/Data_source_name
757+ .. _`PHP semaphore functions ` : https://php.net/manual/en/book.sem .php
758+ .. _`Replica Set Read and Write Semantics ` : https://docs.mongodb.com/manual/applications/replication/
681759.. _`ZooKeeper` : https://zookeeper.apache.org/
0 commit comments