在脚本和一些 PHP 服务器(如脚本)之间共享变量(数组)

Posted

技术标签:

【中文标题】在脚本和一些 PHP 服务器(如脚本)之间共享变量(数组)【英文标题】:Share variables (arrays) between scripts and a few PHP server like scripts 【发布时间】:2018-02-20 13:25:32 【问题描述】:

我正在运行一些 php websocket 服务器脚本。基本上,服务器脚本应该 24 小时运行。 他们应该能够访问一个不太大的数组,比如对象,可能是 2k 到 5k 个项目。 PHP 服务器之类的脚本应该能够写入/读取共享数组。 其他 PHP 脚本(由异步随机 ajax 调用触发)应该能够读/写共享数组。我用 shmop 做了一些测试,但我对需要序列化数据以存储为字符串这一事实不满意,而且我担心并发性。 我不知道如何进行。性能应该是主要目标,而不是数据安全。有什么建议吗?

【问题讨论】:

我不知道数据的格式是什么,但是你可以使用像 Redis 这样的内存数据存储。 谢谢,我会尝试 Redis,我确实尝试过使用 PostgreSQL,在一个未记录的表中,我计算了在服务器脚本的完整循环期间从服务器访问数据所消耗的时间,它需要最多的时间。你知道与 PostgreSQL 相比,我期望 Redis 的执行速度有多快吗? 它是存储在内存中的,所以除非你能在PostgreSQL中把数据库存储在内存中,否则会快很多。 【参考方案1】:

在您所描述的情况下,没有比共享内存更好的存储解决方案了。

如果您只关心批量数据的访问时间,那么 SHM 就是您的“选择”。 您可以简单地创建包装器来维护代码中的序列化和存储。

如果需要以某种方式(索引/排序)存储和访问数据,您应该尝试使用 sqlite 之类的方法,将文件存储在 tmpfs/ramfs(在内存中)。

【讨论】:

您对序列化是正确的,我做了一些测试,与在当前 PostgreSQL 数据库上运行查询相比,它快 150 到 200 倍。向/从共享内存段写入/读取字符串也非常快。我唯一关心的是序列化表示的并发性和可变大小。我应该保留足够大的内存段吗?同时使用来自更多脚本的开放共享内存段并向其读/写数据是否安全?我可以检查共享段是否打开并强制脚本尝试更新到循环中,直到段关闭?

以上是关于在脚本和一些 PHP 服务器(如脚本)之间共享变量(数组)的主要内容,如果未能解决你的问题,请参考以下文章

如何在php脚本之间传递变量?

如何在Powershell中的脚本之间共享变量?

Python:在分叉的孩子和父母之间共享变量

在未加载重复项的多个 python 脚本之间共享变量(来自文件的数据)

是否可以在 Windows 中的 PHP 和 C 之间共享内存?

在烧瓶中的路线和主要之间使用共享变量