Synchronized functions using PHP
Asked Answered
B

4

13

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

Bolter answered 19/9, 2012 at 11:3 Comment(0)
S
16

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:

  • use a lock file (first function locks a file name "f.lok", second function checks if the lock file exists and executes or doesn't based on that evaluation)
  • set a flag in the database (not recomended)
  • use semaphores as @JvdBerg suggested (the fastest)

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:

http://www.re-cycledair.com/php-dark-arts-semaphores

Stylistic answered 19/9, 2012 at 11:10 Comment(4)
Thanks for the support. BTW if you can provide me a code snippet how this is implemented.Bolter
Thanks for the PHP code. Let me check that and get back to youBolter
@VladBalmos: "When coding concurrent," you say... isn't everything PHP always concurrent if more than one user visits the site at the same time or am I missing something fundamental?Encouragement
@Encouragement You are right. I was referring to the ability to access a resource while it's modified by another user and get consistent data, if it makes sense.Stylistic
B
12

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.

Blacktop answered 19/9, 2012 at 11:7 Comment(0)
J
0

off the top of my head:

  • function checks if a database field called isFunctionRunning is equal 1. if not start executing
  • you update the database field called isFunctionRunning to 1
  • function does magic here
  • you update the database field called isFunctionRunning to 0

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.

Jeffryjeffy answered 19/9, 2012 at 11:7 Comment(5)
looks like it's not possible to implement through phpBolter
what is not possible to implement through php ?Jeffryjeffy
if isFunctionRunning returns 1, How can I tell PHP to wait till isFunctionRunning returns 0Bolter
if (isFunctionRunning == 1) { return false; } else { run function run } p.s. instead of updating a db field you could just do that in a file ( would be faster ).Jeffryjeffy
Sorry, I thing that does not work, because in between your first 2 steps, you could get concurrency issues, like 2 threads reading the same 0 from isFunctionRunning and think they are the first. That's why => semaphores.Pizzicato
T
0

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.

Tania answered 9/9, 2018 at 23:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.