Вы можете использовать функцию apc_add , чтобы достичь этого, не прибегая к файловым системам или mysql. apc_add
успешно выполняется только тогда, когда переменная еще не сохранена; Таким образом, обеспечивается механизм блокировки. TTL может использоваться, чтобы гарантировать, что поддельные блокировщики не будут удерживать блокировку вечно.
Причина, по которой apc_add
является правильным решением, заключается в том, что он избегает состояния гонки, которое могло бы существовать между проверкой блокировки и установкой ее на «заблокированную вами». Поскольку apc_add
устанавливает значение только в том случае, если оно не установлено уже («добавляет» его в кэш), это гарантирует, что блокировка не может быть получена двумя вызовами одновременно, независимо от их близости в время. Ни одно решение, которое не проверяет и , одновременно устанавливающие блокировку, не будет страдать от этого состояния гонки; одна атомная операция необходима для успешной блокировки без состояния гонки.
Поскольку блокировки APC будут существовать только в контексте выполнения php, это, вероятно, не лучшее решение для общей блокировки, поскольку оно не поддерживает блокировки между хостами. Memcache
также предоставляет функцию атомарного добавления и, следовательно, может также использоваться с этим методом, который является одним из методов блокировки между хостами. Redis
также поддерживает элементарные функции SETNX и TTL и является очень распространенным методом блокировки и синхронизации между хостами. Однако ОП запрашивает решение для APC, в частности.