Синхронизированные функции с использованием PHP

Как сделать функции в PHP синхронизированными, чтобы одна и та же функция не выполнялась одновременно? 2-й пользователь должен подождать, пока 1-й пользователь не выполнит эту функцию. Затем второй пользователь может выполнить функцию.

благодаря

    Это в основном сводится к установке флага где-то, что функция заблокирована и не может быть выполнена до тех пор, пока первый вызывающий абонент не вернется из этой функции. Это можно сделать несколькими способами:

    • используйте файл блокировки (первая функция блокирует имя файла «f.lok», вторая функция проверяет, существует ли файл блокировки и выполняется или не основан на этой оценке)
    • установить флаг в базе данных (не рекомендуется)
    • использовать семафоры, как @JvdBerg предложил (самый быстрый)

    При кодировании одновременного приложения всегда остерегайтесь условий гонки и тупиков!

    ОБНОВЛЕНИЕ с использованием семафоров (не проверено):

    <?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 должен быть скомпилирован с поддержкой sysvsem для использования функций sem_ *

    Ниже приведено более подробное руководство по использованию семафоров в PHP:

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

    Вы ищете Семафор

    Имейте в виду, что использование семафора (или любого другого механизма блокировки) может иметь серьезные проблемы с выпуском, поскольку запросы не могут обрабатываться при семафоре.

    с верхней части моей головы:

    • функция проверяет, равен ли поле базы данных isFunctionRunning равным 1. Если не начать выполнение
    • вы обновляете поле базы данных с именем isFunctionRunning до 1
    • функция делает магию здесь
    • вы обновляете поле базы данных isFunctionRunning до 0

    но почему-то я думаю, что вы пытаетесь сделать это «неправильно» и может быть достигнуто по-другому. может помочь, если вы скажете подробнее

    edit: не знал о семафорах php, ответ выше будет быстрее.