Альтернатива PHP-семафору?

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

После некоторых исследований я наткнулся на пару обходные пути:


A) Я сделал пару функций для имитации семафоров, которые мне нужны, я думаю:

function SemaphoreWait($id) {
    $filename = SEMAPHORE_PATH . $id . '.txt';
    $handle = fopen($filename, 'w') or die("Error opening file.");
    if (flock($handle, LOCK_EX)) {
        //nothing...
    } else {
        die("Could not lock file.");
    }
    return $handle;
}

function SemaphoreSignal($handle) {
    fclose($handle);
}

(я знаю, что в операторе if есть ненужный код). Что вы ребята думаете? Очевидно, что это не идеально, но подходит ли общая практика? Есть ли проблемы? Это первый раз, когда я работаю с параллелизмом, и мне обычно нравится язык низкого уровня, где он имеет немного больше смысла.

В любом случае, я не могу придумать здесь никаких «логических ошибок», и меня беспокоит только скорость; Я читал, что flockдовольно медленный.


B) MySQL также предоставляет возможность блокировки. Как это соотносится с flock? И я предполагаю, что он блокируется, если скрипт одного пользователя блокирует таблицу, а другой запрашивает ее? Проблема, о которой я могу думать, заключается в том, что это блокирует всю таблицу, но мне действительно нужны блокировки только для отдельных пользователей (поэтому не все ждут).


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

Что, если мне нужно проверить значение перед выполнением действия? Например, мне нужно проверить, достаточно ли силен защитник, прежде чем разрешить атаку, например, достаточно здоровья. И если это так, вступайте в битву и получайте некоторый урон, не позволяя никому испортить / возиться с данными.

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

7
задан Raekye 15 June 2012 в 06:16
поделиться