2012-09-13 45 views
24

我有下面的代码和信号量不会像预期的那样锁定它。php信号量不起作用

(我知道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命中

在Ubuntu 12.04(64位),PHP 5.3.16〜dotdeb,PHP-FPM nginx的

  • 更新1:工作完全上Linux mint,5.4.6〜dotdeb,内置web服务器。我要用nginx试用同一版本的机器。
+2

只是为了澄清:我试图把一个'apc_inc'调用放在锁定块中,并且它全部执行了4000次。 – Alex

+0

据我了解PHP信号量是锁定共享内存和资源,而不是代码块。 我相信它将与PHP共享内存功能 – Bnaya

+1

一起工作我假设sem_get初始化了所有必需的资源,PHP的源代码几乎证实了这一点。他们直接打电话给posix的semget,从那里开始。此外,信号量是同步进程**,不**共享任何内存。 – Alex

回答

1

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