在 Apache 上的 PHP 中的线程之间共享数据

Posted

技术标签:

【中文标题】在 Apache 上的 PHP 中的线程之间共享数据【英文标题】:Sharing data between threads in PHP on Apache 【发布时间】:2013-11-12 02:57:17 【问题描述】:

根据定义,真正的线程不共享内存,因此不能共享数据。

但是,我正在寻找一种方法来保持正在运行的连接计数(不仅仅是连接,还有其他一些东西),它可以从服务器中的任何一个线程中更新,并且将被共享(静态)跨所有线程。我该怎么做?

一些注意事项:

性能是关键,所以没有数据库,没有外部服务器连接,最好没有 Memcached

此数据每秒更新数千次

数据从一个线程更新后,必须立即以新值提供给所有其他线程

理想情况下,数据应该同时可供多个线程使用

【问题讨论】:

这里的大图是什么? 出站数据的序列号,用于生成唯一ID 很抱歉让您失望了,但如果有帮助的话,这更像是一个测试,看看我是否可以做一些更宏大的事情。基本上,我试图在 php 中加入一些 Node.js 类型的行为。 我很好奇为什么没有 memcached。这就是它的设计目的。 延迟最小化。 Memcached 速度很快,但它不是即时的,至少在与之通信的服务器眼中不是。 【参考方案1】:

使用Xcache,您可以使用以下API:

int   xcache_inc(string name [, int value [, int ttl]])

这将自动递增name 标识的值,并将其存储在跨请求的共享内存中。要从 Apache 中任何正在运行的线程中检索值,请使用:

mixed xcache_get(string name)

注意:重新启动 Apache (httpd) 时,这些值会丢失。

注意 2: 根据定义,线程确实共享内存并轻松共享数据,因为它们在同一进程中运行。当性能至关重要并且并行处理大量数据并在线程之间进行协调而不是可能较慢的 IPC 或复杂的共享内存解决方案时,这是使用它们的主要原因之一。但是,线程之间共享数据很复杂,尤其是当数据是可变的并且应该由对挑战有透彻了解的人来承担时。

【讨论】:

以上是关于在 Apache 上的 PHP 中的线程之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章

如何设置Apache中的最大连接数

Java 线程系列Java线程之间的共享和协作

Apache2 worker

并发编程之线程共享和协作

CUDA笔记(一)线程与数据量的关系

在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?