【问题标题】:php semaphore doesn't workphp信号量不起作用
【发布时间】: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 版本,尝试更新。

标签: php semaphore apc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 2021-04-21
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多