Как реализовать семафоры в PHP без PHP Semaphore? - PullRequest
2 голосов
/ 08 марта 2011

Вопрос:

Как реализовать переменную общей памяти в PHP без пакета семафора (http://php.net/manual/en/function.shm-get-var.php)?

Context

  • У меня есть простое веб-приложение (на самом деле плагин для WordPress)
  • , которое получает URL
  • , затем проверяет базу данных, если этот URL уже существует
  • если нет, то он отключается и выполняет некоторые операции
  • , а затем записывает запись в базу данных с URL-адресом в качестве уникальной записи

В действительности происходит то, что4,5,6 ... сеансов одновременно запрашивают URL, и я получаю до 9 повторяющихся записей в базе данных URL .. (возможно, 9, потому что время обработки и запись в базу данных первой записи занимает достаточно временичтобы пропустить 9 других запросов). После этого все запросы читают правильную запись о том, что запись уже существует, и это хорошо.

Поскольку это плагин WordPress, на всех видах общего хостинга будет много пользователей.участок землиформы с переменными компиляциями / настройками PHP.

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

fyi: код базы данных: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/plugins/metadata_favicon/inc/class-favicon.php

update

Использованиеуникальный ключ на новом хэше URI md5 вместе с ловит попытки, кажется, работает.

Я нашел 1 дубликат записи с

SELECT uri, COUNT( uri ) AS NumOccurrences
FROM edl40_21_wpfavicons_1
GROUP BY uri
HAVING (
COUNT( uri ) >1
)
LIMIT 0 , 30

Так что я думал, что это не сработало, но этопотому что они были:

http://en.wikipedia.org/wiki/Book_of_the_dead
http://en.wikipedia.org/wiki/Book_of_the_Dead

(столицами усмехается)

Ответы [ 2 ]

3 голосов
1 голос
/ 08 марта 2011

В PHP есть другие модули совместно используемой памяти (например, shmop или APC ), но я думаю, что вы говорите, что существует проблема, основанная на нестандартных / предустановленные библиотеки.

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

Затем, когда вы выполните «другие операции», обновите запись базы данных до «доступно» и сделайте все, что вам нужно.

...