【发布时间】:2012-09-13 13:47:18
【问题描述】:
我有以下代码,但信号量不会按预期锁定它。
(我知道 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 (64bit) 上的 nginx,php 5.3.16~dotdeb,php-fpm
- 更新 1:在 Linux mint 5.4.6~dotdeb 上完美运行,内置 Web 服务器。我打算在同一台机器上用相同版本的nginx试试。
【问题讨论】:
-
澄清一下:我尝试在锁定的块内调用
apc_inc,它被执行了4000次。 -
据我了解 PHP 信号量是锁定共享内存和资源,而不是代码块。我相信它将与 PHP 共享内存函数一起使用
-
我假设 sem_get 初始化了所有必需的资源,而 PHP 的源代码几乎证实了这一点。他们直接调用了 posix 的 semget,它从那里开始。此外,信号量用于同步不共享任何内存的进程。
-
您的代码没有检查 sem_acquire() 的返回值(可能失败)
-
我认为这是 apc 有问题,与信号量无关,请检查两个测试中的 apc 版本,尝试更新。