如何实现维持一个在 PHP 程序运行期间一直存在的常量数组?

2018-11-14 20:04:53 +08:00
 webgrin
出于减少数据库查询优化程序性能的考虑,打算把一个程序运行期间高频使用的数据集保存到一个常量多维数组里面,即需要访问此数据集不再查询数据库,直接访问此数组即可,此数组在多个不同 php 程序文件里面都需要使用。

由于这个数组里面的数据随着网站运行,会增加新数据,故无法硬编码到 php 程序文件里面。

我初步想法是把数据更新的时候,自动将此数组写入一个 JSON 文件存储到网站本地目录下面,然后在每个 php 文件开头读取此文件然后解析后生成数组供后续函数使用。我的粗浅理解是查询数据库的性能会低于直接读取一个本地文件,不知道是否正确?

水平比较渣,感觉此方法不精致。请教高手,有什么更高效的实现思路?
5315 次点击
所在节点    PHP
45 条回复
jessynt
2018-11-14 20:07:59 +08:00
yac?
eggshell
2018-11-14 20:10:27 +08:00
“打算把一个程序运行期间高频使用的数据集保存到一个常量多维数组” , redis 不符合要求吗?
webgrin
2018-11-14 20:16:27 +08:00
@eggshell 惭愧,只会简单编程,暂时只考虑不借助外在工具,完全使用 php 实现。谢谢回复,有时间再学下 redis
zjsxwc
2018-11-14 20:20:02 +08:00
文件缓存,实现方式千变万化
0ZXYDDu796nVCFxq
2018-11-14 20:20:30 +08:00
是什么让你产生读数据库比读文件快的错觉……

另外,文件需要更新,你怎么保证线程安全的同时性能不明显下降?每更新一次需要写入整个数组
随便一个数据库都比你这个方案强
dobelee
2018-11-14 20:21:05 +08:00
php 常驻进程。这种情况 redis 最简单。
Lax
2018-11-14 20:24:35 +08:00
正确的写个文件缓存系统,可真不如直接用成熟的方案,除非是条件不允许。
zjsxwc
2018-11-14 20:25:18 +08:00
搜索了下,除了$_SESSION 变量,php 居然有个神奇的变量应该可以满足楼主需求 $_ENV['foobar']
zjsxwc
2018-11-14 20:26:24 +08:00
$_ENV 改 linux 全局环境变量来共享数据
chinvo
2018-11-14 20:29:41 +08:00
PHP-FPM/Apache Mod 正常情况下执行是一次访问一个实例的,执行完即销毁,除了 session env 之外就只能用 文件 /memcached/redis 等了
visonme
2018-11-14 20:35:56 +08:00
不依赖第三方,比较常用的应该就是文件方式存储(数据存储结构以那种方式优,自己评估),全局共享内存,SESSION,当然如果可以还是最推荐通过 redis 来存储
webgrin
2018-11-14 20:47:53 +08:00
@visonme 谢谢回复了解决思路,现在只是想用最简单的方法实现,所以才想出了这个笨办法。
webgrin
2018-11-14 20:51:29 +08:00
@zjsxwc 使用全局变量好像不解决问题,全局变量也无法跨文件使用。如果所有文件都引用一个共同的文件,就又回到了起点,相当于每个文件都需要查询一次数据库然后再转换数据得到目标数组。
loginv2
2018-11-14 20:53:18 +08:00
php 可以用共享内存的,和读写文件一样的操作
loginv2
2018-11-14 20:53:39 +08:00
其他语言也可以读写
webgrin
2018-11-14 21:02:30 +08:00
@loginv2 共享内存有待进一步学习。谢谢回复。
Event
2018-11-14 21:03:51 +08:00
redis/memcached
0xff0x77
2018-11-14 21:05:51 +08:00
楼主想法很好,但是你考虑过 IO 性能吗?

没有什么方案可选的,其实楼主就是在纠结这么几点。
1、文件缓存
2、redis 缓存
3、shm 缓存
4、数据库读取

到底用哪个?

这四个中,shm 最快,其他都差不多,数据库最慢。
但是 shm 和文件不支持分布式

shm 可以使用余庆大佬的 https://github.com/happyfish100/libshmcache
也可以考虑鸟哥之前的 APCU,当然两者有区别,本质上性能比 redis 和数据库等需要 io 操作的东西快 100 倍
xiaoz
2018-11-14 21:47:38 +08:00
redis 进行缓存比较符合要求,而且效率很高。
ywisax
2018-11-14 22:00:31 +08:00
直接存放 redis 比较好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/507889

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX