apc_store()线程安全吗?

时间:2017-07-18 13:43:47

标签: php nginx thread-safety apc hiphop

PHP.net manual中没有提及线程安全性。

我们正在使用nginx服务器运行Hiphop PHP。一台服务器每天接收订单量为3000万的请求。

团队成员说他们之前曾经观察到apc_store()的问题,当他们使用它来向系统的请求添加一些值时。由于多个线程正在运行,由nginx启动,似乎有些值会丢失,因为多个线程同时引用存储在缓存中的相同值并尝试更新它们。因此,在这些情况下,他们切换到了apc_inc()。

我的观察

  • 我发现使用这些函数导致的值没有任何差异。
  • 这些值似乎与nginx访问日志文件中相同时间段内的日志数量相符。

这让我相信两者都是线程安全的。如果我错了,请纠正我。

更新

以下是/etc/hiphop/hiphop.hdf文件中可能相关的部分 -

Server {
        SourceRoot = /var/cake_1.2.0.6311-beta/app/webroot
        RequestTimeoutSeconds = 10
        RequestMemoryMaxBytes = -1
        DefaultDocument = fam/hiphop.php
        Type = fastcgi
        Port = 9000
        IP = 0.0.0.0
        ThreadCount = 140
        ThreadRoundRobin = false
        ThreadDropCacheTimeoutSeconds = 0
        ThreadJobLIFO = false
        StatCache = false
        AlwaysUseRelativePath = false
        RequestInitDocument = /var/cake_1.2.0.6311-beta/app/webroot/openx/www/delivery/startup.php
        RequestInitFunction = requestStart
        ForceServerNameToHeader = false

        EnableKeepAlive = true
        EnableEarlyFlush = true

        ConnectionTimeoutSeconds = 120

        # shutdown options
        GracefulShutdownWait = 0   # in seconds
        HarshShutdown = true
        EvilShutdown = true
        DanglingWait = 0
        MaxPostSize = 8  # in MB
        LibEventSyncSend = true
        ResponseQueueCount = 0
        DefaultCharsetName = UTF-8

        APC {
                EnableApc = true
                TableType = concurrent
                ExpireOnSets = true
        }

}

但是,看起来它没有回答如何根据APC变量使用配置Hiphop - - 配置为作为一个具有多个线程的单个进程运行 要么 - 配置为使用共享内存运行APC。

参考https://github.com/petehunt/hiphop-php/blob/master/doc/runtime.memory_model

1 个答案:

答案 0 :(得分:1)

是的,这是线程安全的! Apcu使用rwlock来保证它的线程安全,你可以在源代码apcu/apc_cache.c中找到它。