How to make functions in PHP synchronized so that same function won't be executed concurrently ? 2nd user must wait till 1st user is done with the function. Then 2nd user can execute the function.
Thanks
This basically comes down to setting a flag somewhere that the function is locked and cannot be executed until the first caller returns from that function. This can be done in a number of ways:
When coding concurrent application always beware of race conditions and deadlocks!
UPDATE using semaphores (not tested):
<?php
define('SEM_KEY', 1000);
function noconcurrency() {
$semRes = sem_get(SEM_KEY, 1, 0666, 0); // get the resource for the semaphore
if(sem_acquire($semRes)) { // try to acquire the semaphore. this function will block until the sem will be available
// do the work
sem_release($semRes); // release the semaphore so other process can use it
}
}
PHP needs to be compiled with sysvsem support in order to use sem_* functions
Here's a more in depth tutorial for using semaphores in PHP:
You are looking for a Semaphore
Bear in mind that using a semaphore (or any other blocking mechanism) can have serious peformance issues, as the requests can not be handled while the semaphore is up.
You can use the "flock" (file locking) function with the "LOCK_EX" (exclusive lock) flag to create a custom "synchronized" function that accepts a handler to be synchronized.
You may may found the code here.
I hope this helps.
off the top of my head:
but somehow i think what you are trying to do is "wrong" and can be achieved in another way. could help if you said more details
edit: wasn't aware of php semaphores, the answer above will be way faster.
isFunctionRunning and think they are the first. That's why => semaphores.Unless PHP is single-threaded, and for all server operating systems (see my comments), I think you need a two-phase solution. In phase 1, each process waits for each of two locks, lock1 and lock2, to be free (with timeout), then registers its desire to use the resource by again checking and setting both locks. The checking is done by storing the same random number into both lock files. In phase 2, the process ensures that it still has both locks set, then uses the shared resource, then clears the locks. I haven't tested it, but I'm going to try it.
Note that lock operations have to suspend the usual PHP file caching.