PHP信号量不起作用

24

我有以下代码,但是信号量没有像预期的那样锁定它。

(我知道apc_inc。但这不是我想要的。)

$semkey = sem_get(123);
sem_acquire($semkey);

$count = apc_fetch('count111');
if(!$count) $count = 0;
$count++;
apc_store('count111', $count);

sem_release($semkey);

接着执行:

ab -n 4000 -c 200 http://localhost/test.php

0个请求失败。

但之后使用apc_fetch('count111')只显示大约1200次点击量。

服务器环境为:nginx on ubuntu 12.04(64位),php 5.3.16~dotdeb,php-fpm。

  • 更新1:在Linux mint上完美运行,版本为5.4.6~dotdeb,内置web服务器。我将尝试在同一台机器上使用相同的版本与nginx进行测试。

2
只是为了澄清:我尝试将apc_inc调用放在锁定的块内,它被执行了4000次。 - Alex
1
我假设sem_get初始化了所有必需的资源,PHP的源代码基本上证实了这一点。他们直接调用了posix的semget,然后继续执行。此外,信号量旨在同步不共享任何内存的进程。 - Alex
2
你的代码没有检查sem_acquire()的返回值(它很可能失败了)。 - symcbean
1
我认为这是APC出现了故障,与信号量无关,请检查两个测试中的APC版本,尝试更新。 - fd8s0
@Alex:这个问题现在解决了吗?还是你仍然有这个问题?问题只出现在Nginx上,但内部Web服务器可以正常工作吗? - hakre
显示剩余8条评论
1个回答

1
问题显然出在APC本身,而不是信号量上。
升级到PHP 5.4.8-1~dotdeb.0已经解决了nginx和内置服务器测试运行的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接