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. Semáforos é utilizado para restringir o acesso a recursos compartilhados, tais como a memória partilhada ou de limitar o número de processos que podem utilizar simultaneamente um recurso, em um processo multi-threaded ou multi-ambiente.

In php using semaphore a process must wait while accessing a shared resource currently used by another process. Nos semáforos php usando um processo tem de esperar ao acessar um recurso de partilha actualmente utilizado por um outro processo. But this may not be required for all cases. Mas este pode não ser exigida para todos os casos. Sometimes we need to just verify whether a resource has been locked and move on. Às vezes temos que apenas verificar se um recurso foi bloqueada e seguir em frente. Unfortunately we have no way to check the status of a semaphore lock in php. Infelizmente, não há maneira de verificar o status de uma fechadura semáforos em php. Let’s see how we can implement non-blocking semaphore access in PHP. Vamos ver como podemos implementar semáforos não-bloqueando o acesso em PHP.

As the semaphore library doesn’t give us what we need we will have to use file existence as a lock instead. Tal como a biblioteca semáforos não nos dão aquilo que nós vamos ter necessidade de utilizar arquivo existência como um bloqueio vez. The concept and implementation is simple: A concepção e implementação é simples:
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. Antes de aceder a um recurso comum que você tem que verificar se um pré-determinado arquivo (dizer. Lock) arquivo existe e modificação não será superior a uma hora fixa (configuráveis) expirar o tempo. 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. A segunda condição é necessária para recuperar antigos de eclusas, que não tenham sido apuradas devido ao encerramento abrupto do anterior processo ou outras razões.

2. If either of the condition is not satisfied in step 1 then create or modify the lock file and use the shared resource. Se quer da condição não é satisfeita na etapa 1 então criar ou modificar o arquivo e bloquear o uso de recursos. After you are done, you must delete the lock file to allow subsequent access of the shared resource. Depois que você está feito, você deve apagar o arquivo para permitir a posterior bloqueio de acesso a recursos partilhados. 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. O apagamento deve ser feito independentemente de qualquer erro condição em fases anteriores pela boa exceção / erro de manipulação etapas anteriores, para evitar a cessação abrupta.

3. If both the conditions are satisfied then the resource has been locked and not available currently. Se ambas as condições estão satisfeitas, então o recurso tenha sido bloqueado e não está disponível atualmente. Now you can either wait and check periodically in a loop with sleep or move on to next tasks. Agora você pode esperar e verificar periodicamente, por um laço com o sono ou passar para a próxima missão.

Let look at how we can implement this with sample code: Deixe pensar na forma como podemos implementar esta amostra com o código:

 if(file_exists(".lock") && ((time() - filemtime(".lock")) < 1800)) {     // The resource is locked. if (file_exists ( ". lock") & & ((time () - filemtime ( ". lock")) <1800)) (/ / O recurso está bloqueado. 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. Você pode passar à próxima tarefas ou aguardar e verificar periodicamente em um outro local loop) (@ toque ( ". Lock"); / / Utilização dos recursos partilhados aqui / / Idealmente este deverá ser feito depois do erro no manuseio etapas anteriores, / / por isso não pode impedir os erros causados acima execução desta etapa. @unlink(".lock"); // Release the lock } @ unlink ( ". lock"); / / libertar o bloqueio)