与apc_exists和apc_add的死锁?(apc和PHP)

Dan*_*Ser 7 php apc

我不知道是否有人已经发现任何奇怪的行为apc_exists(),导致整个WAMP服务器挂起一起使用时的行为apc_add()apc_store()?经过长时间的"调试"并最小化问题后,我最终得到了以下代码,导致我的WAMP崩溃.

据我所知,它需要1 apc_exists()和2 apc_add()访问不同的密钥.[因此它听起来像死锁问题​​]我在chrome中运行这个脚本,然后粉碎F5​​键,直到我得到两次发生rand-thingy.那时或第一次它通常挂起.

<?php
$result = "asdfioasdjfoasdjf";
if(apc_exists("asdf")) {
    echo("#1<br/>");
    apc_add("launcher", $result, 1);
} else {
    echo("#2<br/>");
    $result = "asdfasdfasdf";
    apc_add("launcher", $result, 10);
}
if(rand(0,100) < 4) {
    echo("#stored data!<br/>");
    apc_add("asdf", "2130130", 1);
}
?>
Run Code Online (Sandbox Code Playgroud)

我的系统/设置:
Windows 7 64位
WAMP 2.2d 32位
PHP版本5.3.10
apc版本3.1.9 | $ Revision:325040 $

我在代码中做错了吗?这与windows/wamp有关还是存在于其他环境和php/apc-versions中?在上述情况下,如果我更换apc_exists()apc_fetch()时,系统不会崩溃,没有人知道为什么吗?

Mah*_*ahn 5

我相信我找到了原因.这一切都归结为这个很好的答案在这里SO:

首先,重要的是要知道如果一个人试图存储一个已经存在特定TTL的密钥,并且ttl还没有通过,那么将创建一个新条目; 这不要紧,如果关键是一样的,内部有是相同的密钥的两个条目.

其次,APC可能会失败(未命中).即使没有明显的理由.为什么?APC显然有利于速度超过一致性,这意味着当APC驱动程序忙于进行一些清理时,它将简单地返回NULL而不是等到它完成,即使数据存在.这里的长版本是:http://phpadvent.org/2010/share-and-enjoy-by-gopal-vijayaraghavan

那么在问题中提到的具体案例中发生了什么?每个请求之间的时间短于1秒,即指定的密钥TTL,因此如果您尝试在此处存储密钥,则可能会发生重复."但是,它正在使用apc_add,不应该保证只有在密钥不存在的情况下才存储密钥吗?" 显然没有:)这是什么原因造成的僵局是随机的:有时apc_add将努力为你所期望的,有些则是"失误",也就是apc_add不知道有哪怕是有其他现有的密钥.这可能不是一个问题,如果TTL = 0,因为在这种情况下,关键是简单地覆盖,但在问题的特定情况下,它会重复存储为错误地未能找到问题的关键和具有关键结果一个尚未通过的TTL.

从现在开始,内部有两个具有相同键的条目,当使用apc_exists时,它会混淆并挂起.

小贴士:不要在APC上存储标志,并且在"未命中"的情况下始终准备一个后备案例.当用于存储其他地方存在的东西的副本(即文件或数据库条目)时,APC似乎效果最好

  • 解释翻译是"APC如何工作"?我想不是.我很确定这是APC中的一个错误,应该相应地报告. (2认同)