Вопрос:
Как реализовать переменную разделяемой памяти в PHP без пакета семафоров (http://php.net/manual/en/function.shm-get-var.php) ?
Контекст
- У меня есть простое веб-приложение (фактически плагин для WordPress)
- это получает URL
- затем это проверяет базу данных, если этот URL-адрес уже существует
- если нет, то он выходит и выполняет некоторые операции
- а затем записывает запись в базу данных с URL-адресом как уникальную запись
На самом деле происходит то, что 4,5,6... сеансы одновременно запрашивают URL-адрес, и я получаю до 9 повторяющихся записей в базе данных URL-адреса.. (возможно, 9, потому что время обработки и запись в базу данных первая запись занимает достаточно времени, чтобы пропустить 9 других запросов). После этого все запросы читают правильную запись о том, что запись уже существует, так что это хорошо.
Поскольку это плагин WordPress, будет много пользователей на всех типах платформ общего хостинга с переменными компиляциями/настройками PHP.
Поэтому я ищу более универсальное решение. Я не могу использовать запись в базу данных или текстовый файл, так как это будет слишком медленно. пока я пишу в БД, следующая сессия уже пройдет.
к вашему сведению: код базы данных: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/plugins/metadata_favicon/inc/class-favicon.php
обновить
Использование уникального ключа для нового хэша md5 uri вместе с try catch вокруг него, кажется, работает.
Я нашел 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
(столицы ухмыляются)