Semaphore is used to restrict access to shared resources, such as shared memory or to limit the number of processes that may simultaneously use a resource, in a multi-process or multi-threaded environment. Семафор используется для ограничения доступа к общим ресурсам, таким как разделяемой памяти или ограничивать число процессов, которые могут одновременно использовать ресурс, в нескольких процесса или многопоточном окружении.

In php using semaphore a process must wait while accessing a shared resource currently used by another process. В php с использованием семафоров процесс должен ждать, пока доступа общий ресурс в настоящее время используется другим процессом. But this may not be required for all cases. Но это не может быть необходимым для всех случаев. Sometimes we need to just verify whether a resource has been locked and move on. Иногда нам нужно просто проверить, является ли ресурс был закрыт и двигаться вперед. Unfortunately we have no way to check the status of a semaphore lock in php. К сожалению, мы никак не сможете проверить состояние блокировки семафоров в php. Let’s see how we can implement non-blocking semaphore access in PHP. Давайте посмотрим, каким образом мы можем осуществлять, не-блокирование доступа на семафоре PHP.

As the semaphore library doesn’t give us what we need we will have to use file existence as a lock instead. Как семафор библиотека не дает нам то, что надо нам придется использовать файл существование в качестве шлюза вместо. The concept and implementation is simple: Концепции и реализации проста:
1. Before accessing a shared resource you have to check whether a pre-determined file (say .lock ) exists and file modification time doesn’t exceed a fixed (configurable) expire time. Перед доступом общий ресурс нужно проверить, заранее определенные файл (скажем. Блокировки) существует и модификация файла не будет превышать фиксированной (конфигурируемый) истекает время. The second condition is required to recover from old locks which haven’t been cleared due to abrupt termination of the previous process or other reasons. Второе условие необходимо для восстановления старых замков, которые не были расчищены из-за внезапного прекращения действия предыдущего процесса или по другим причинам.

2. If either of the condition is not satisfied in step 1 then create or modify the lock file and use the shared resource. Если какая-либо из условий не удовлетворен в шаге 1 затем создать или модифицировать файл блокировки и использования общих ресурсов. After you are done, you must delete the lock file to allow subsequent access of the shared resource. После вы сделали, вы должны удалить файл блокировки с тем чтобы последующие доступа общий ресурс. The deleting must be done irrespective of any error condition in earlier stages by proper exception / error handling of earlier steps to prevent abrupt termination. Исключение должно быть сделано независимо от каких-либо ошибок состоянии, в ранних стадиях путем надлежащего исключения / ошибка обработки ранее меры для предотвращения резкого прекращения.

3. If both the conditions are satisfied then the resource has been locked and not available currently. Если оба условия удовлетворены тогда ресурс был закрыт, и в настоящее время не имеется. Now you can either wait and check periodically in a loop with sleep or move on to next tasks. Теперь вы можете подождать и периодически проверять в цикле со сна или переходить к следующей задачи.

Let look at how we can implement this with sample code: Позвольте взглянуть на то, как мы можем осуществить это с образец кода:

 if(file_exists(".lock") && ((time() - filemtime(".lock")) < 1800)) {     // The resource is locked. если (file_exists ( ". замок") и и ((времени () - filemtime ( ". замок")) <1800)) (/ / The ресурс заблокирован. You can either move on to next tasks or wait and check periodically in a loop } else {     @touch(".lock");     // Use shared resource here     // Ideally this should be done after error handling in previous steps,     // so no errors caused above can prevent execution of this step. Вы можете перейти к следующей задачи или ждать и периодически проверять в цикле) (@ остальное контакт ( ". Замок") / / Использование общих ресурсов, здесь / / В идеале это должно быть сделано после обработки ошибок в предыдущих этапов, / / так что никаких ошибок в результате выше, может помешать выполнению этого шага. @unlink(".lock"); // Release the lock } @ удалить ( ". замок") / / Выпуск блокировка)