【发布时间】:2011-03-07 23:23:33
【问题描述】:
问题:
如何在没有信号量包的情况下在 PHP 中实现共享内存变量 (http://php.net/manual/en/function.shm-get-var.php)?
上下文
- 我有一个简单的 Web 应用程序(实际上是 WordPress 的插件)
- 这会得到一个网址
- 然后检查数据库是否该 url 已经存在
- 如果不是,则它会退出并执行一些操作
- 然后将记录写入数据库中,以url作为唯一条目
实际发生的情况是 4,5,6 ... 会话同时请求 url,我在 url 的数据库中获得多达 9 个重复条目..(可能是 9,因为处理时间和数据库写入第一个条目只需要足够的时间让其他 9 个请求通过)。之后,所有请求都读取记录已经存在的正确条目,这很好。
由于它是一个 WordPress 插件,因此在各种共享主机平台上都会有很多用户使用可变的 PHP 编译/设置。
所以我正在寻找更通用的解决方案。我不能使用数据库或文本文件写入,因为它们太慢了。当我写到数据库时,下一个会话已经过去了。
更新
在 uri 的新 md5 散列上使用唯一键以及周围的 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
(大写的咧嘴笑)
【问题讨论】:
标签: php wordpress locking deadlock semaphore