2017-07-18 51 views
0

PHP.net manual关于线程安全没有提及。apc_store()线程安全吗?

我们使用nginx服务器运行Hiphop PHP。一台服务器每天接收3千万个订单的请求。

团队成员说他们以前在观察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 
     } 

} 

但是,看起来并不像它回答Hiphop的是如何在配置方面的APC变量用法 - - 配置为作为一个具有多个线程的单个进程运行 或 - 配置为使用共享内存运行APC。

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

+1

https://github.com/petehunt/hiphop-php/blob/master/doc/runtime.memory_model有帮助吗? –

+0

@NigelRen添加了更新。请看看你能否帮忙。 –

回答

0

是的,它是线程安全的! Apcu使用rwlock承诺它是线程安全的,U可以在源代码apcu/apc_cache.c中找到它。