лучший способ получить блокировку в php

Можно также сделать это с помощью pylab и xticks

import pylab as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()

http://matplotlib.org/examples/ticks_and_spines /ticklabels_demo_rotation.html

17
задан tpk 28 November 2008 в 16:39
поделиться

5 ответов

Если точка блокировки должна препятствовать тому, чтобы несколько процессов пытались заполнить пустой ключ кэша, почему Вы не хотели бы иметь блокирующуюся блокировку?


  $value = apc_fetch($KEY);

  if ($value === FALSE) {
      shm_acquire($SEMAPHORE);

      $recheck_value = apc_fetch($KEY);
      if ($recheck_value !== FALSE) {
        $new_value = expensive_operation();
        apc_store($KEY, $new_value);
        $value = $new_value;
      } else {
        $value = $recheck_value;
      }

      shm_release($SEMAPHORE);
   }

, Если кэш хорош, Вы просто прокручиваетесь с ним. Если нет ничего в кэше, Вы получаете блокировку. После того как у Вас есть блокировка, необходимо будет перепроверить кэш, чтобы удостовериться, что, в то время как Вы ожидали для получения блокировки, кэш не был повторно заполнен. Если кэш был повторно заполнен, используйте то значение & выпустите блокировку, иначе, Вы делаете вычисление, заполняете кэш & затем выпустите свою блокировку.

5
ответ дан 30 November 2019 в 12:01
поделиться

На самом деле проверьте, чтобы видеть, будет ли это работать лучше затем предложение Peter.

http://us2.php.net/flock

использует монопольную блокировку и если Ваше удобное ею, поместите все остальное, что попыталось заблокировать файл в 2-3 вторых снах. При правильной организации Ваш сайт испытает подвешивать относительно заблокированного ресурса, но не орды сценариев, борющихся для кэширования samething.

3
ответ дан 30 November 2019 в 12:01
поделиться

Если Вы не возражаете основывать свою блокировку на файловой системе, то Вы могли использовать fopen () с режимом 'x'. Вот пример:

$f = fopen("lockFile.txt", 'x');
if($f) {
    $me = getmypid();
    $now = date('Y-m-d H:i:s');
    fwrite($f, "Locked by $me at $now\n");
    fclose($f);
    doStuffInLock();
    unlink("lockFile.txt"); // unlock        
}
else {
    echo "File is locked: " . file_get_contents("lockFile.txt");
    exit;
}

См. www.php.net/fopen

3
ответ дан 30 November 2019 в 12:01
поделиться

То, что я нашел, на самом деле, то, что мне не нужна никакая блокировка, вообще... данная, что я пытаюсь создать, карта всего класса => ассоциации пути для автозагрузки, не имеет значения, если один процесс перезаписывает то, что другой нашел (это очень маловероятно, если кодировано правильно), потому что данные доберутся там в конечном счете так или иначе. Так, решение не оказалось "никакими блокировками".

0
ответ дан 30 November 2019 в 12:01
поделиться

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

Мне пришло в голову, что решение возможно с использованием самого APC. Называйте меня сумасшедшим, но это может быть работающий подход:

function acquire_lock($key, $expire=60) {
    if (is_locked($key)) {
        return null;
    }
    return apc_store($key, true, $expire);
}

function release_lock($key) {
    if (!is_locked($key)) {
        return null;
    }
    return apc_delete($key);
}

function is_locked($key) {
    return apc_fetch($key);
}

// example use
if (acquire_lock("foo")) {
    do_something_that_requires_a_lock();
    release_lock("foo");
}

На практике я могу бросить туда другую функцию, чтобы сгенерировать ключ для использования здесь, просто чтобы предотвратить столкновение с существующим ключом APC, например:

function key_for_lock($str) {
    return md5($str."locked");
}

Параметр $expire является хорошей возможностью для использования APC, так как он предотвращает сохранение блокировки навсегда, если ваш скрипт умирает или что-то в этом роде.

Надеюсь, что этот ответ будет полезен всем, кто наткнется на него через год.

1
ответ дан 30 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: