Как заблокировать одновременное использование несколькими пользователями одного метода в PHP? - PullRequest
0 голосов
/ 11 августа 2011

Я занимаюсь разработкой системы хранения записей, которая хранит отсканированные, проиндексированные и зашифрованные записи в физических ящиках.

У меня есть метод сказать "getAvailablePlace ()", который проверяет, какой ящик и какой seq доступен для хранения.Я хочу заблокировать этот метод.Т.е. когда один пользователь вводится в этот метод и он получает box: 12 seq: 55 как пустое место .. одновременно в то же время другой пользователь обращается к тому же методу, он может также получить те же значения..box: 12 seq: 55, что является ошибкойprone.

Так, если я могу заблокировать этот метод, когда один пользователь уже вовлечен в этот процесс?

Я использую SQLite, wamp и codeigniter.

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Я использую этот код:

define('LOCK_FILE', "/path/to/your/lockfile-".$argv[1].".lock");
if( isLocked() ) die("ALREADY RUNNING !!!!\n" );

function isLocked()
{
    # If lock file exists, check if stale.  If exists and is not stale, return TRUE
    # Else, create lock file and return FALSE.

    if( file_exists( LOCK_FILE ) )
    {
        # check if it's stale
        $lockingPID = trim( file_get_contents( LOCK_FILE ) );

       # Get all active PIDs.
        $pids = explode( "\n", trim( `ps -e | awk '{print $1}'` ) );

        # If PID is still active, return true
        if( in_array( $lockingPID, $pids ) )  return true;

        # Lock-file is stale, so kill it.  Then move on to re-creating it.
        echo "Removing stale lock file.\n";
        unlink( LOCK_FILE );
    }

    file_put_contents( LOCK_FILE, getmypid() . "\n" );
    return false;
} 

Вы можете изменить его, чтобы не проверять pid, а просто использовать файл в качестве информации о блокировке.

1 голос
/ 11 августа 2011

Здесь общий подход: есть другая таблица, в которой хранятся ящики, которые «заблокированы» на данный момент.Затем разверните «getAvailablePlace ()», чтобы проверить наличие заблокированных ящиков перед созданием следующего идентификатора ящика.После создания идентификатора ящика запишите его в таблицу блокировок.Все три операции должны выполняться в транзакции базы данных.

Другим решением будет подсчет порядковых номеров в базе данных для каждого блока.Если вы выполняете операции «получить наибольшую последовательность для блока y, добавьте к нему 1, запишите его обратно» в транзакции, все будет в порядке.

0 голосов
/ 11 августа 2011

Вы не можете сделать это в PHP, так как каждый пользователь получает свое собственное время выполнения. Но вы можете сделать это с помощью некоторых внешних методов, например, locks таблица в базе данных. Таким образом, ваша функция проверяет, существует ли какая-либо запись в таблице, пропускает / возвращает false или что-то еще, если она есть, и запускает защищенный код, если ее нет.

Обратите внимание, что вам придется реализовать двойную проверку для действительно безошибочного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...