2014-11-26 1 views
2

Скажите, что у меня есть приложение, получающее одновременные запросы. Пользователь A и B отправляет запросы одновременно, мне нужно обрабатывать запросы в очереди.Как создать механизм блокировки php при одновременных запросах?

мне нужно что-то вроде этого:

function processRequests() { 
    if(locked()) { 
    wait(); 
    } 

    $this->lock(); 
    ...process... 
    $this->unlock(); 
} 

Есть ли какие-либо пакеты или шаблоны, помогающие решить эту проблему?

ПОЖАЛУЙСТА, НЕ ПРЕДОСТАВЛЯЙТЕ ЛЮБЫЕ РЕШЕНИЯ «СООБЩЕНИЕ СЕРВЕРА».

+0

Добавить запрос к базе данных (вставка), иметь отдельный процесс постоянно проверять наименьшую Индентификационный, который не был обработан, и обработать его – RichardBernards

+0

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

+0

Зачем вам это нужно? – Grzegorz

ответ

2

Используя PHP Semaphore functions, вы можете реализовать простую систему блокировки, которая попытается получить блокировку на основе ключа, который идентифицирует ресурс, который вы хотите заблокировать. sem_acquire функция будет блокировать и ждать, пока семафор не может быть получен:

$sm = sem_get(getmyinode() + hexdec(substr(md5("identifier to lock"), 24))); 

if (sem_acquire($sm)) { 

    ...process... 

    sem_release($sm); 
    sem_remove($sm); 

} else { 
    throw new \Exception('unable to acquire semaphore'); 
} 
1

Вы могли бы злоупотреблять flock(), чтобы сделать свой собственный семафор. Линия flock($f, LOCK_EX) будет блокироваться до тех пор, пока другой процесс не освободит блокировку в flock($f, LOCK_UN). Подробнее на php.net.

<?php 
if (! ($f = fopen('/dev/null', 'r'))) 
    print('Oops, no /dev/null on this system?\n'); 
else { 
    flock($f, LOCK_EX); 
    print("I have the lock, I can do stuff now.\n"); 
    sleep(3); 
    print("I am done, releasing.\n"); 
    flock($f, LOCK_UN); 
    fclose($f); 
} 
?> 

 Смежные вопросы

  • Нет связанных вопросов^_^