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

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

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

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

水平比较渣,感觉此方法不精致。请教高手,有什么更高效的实现思路?
5339 次点击
所在节点    PHP
45 条回复
Actrace
2018-11-14 22:54:39 +08:00
一般 /tmp 似乎是挂内存的,直接在 /tmp 读写文件共享数据就好了,如果要求保持一致性的话,写的时候记得加个锁。
akira
2018-11-14 23:55:59 +08:00
这就是典型的内存缓存的作用啊,memcache 和 redis 都可以满足你的需求
t6attack
2018-11-15 00:22:28 +08:00
用文件当缓存,有个最简单方式,很多人使用过 ramdisk 类软件,弄出的内存虚拟盘,接近内存的读写效率。
而 centos 下,/dev/shm 目录就是系统自带的 ramdisk。把文件存在这里,就是内存的读写效率,重启后自动消失。
rebill
2018-11-15 00:35:44 +08:00
APCu 了解一下。`apcu_fetch` `apcu_store` 应该就能满足你的需求了。
msg7086
2018-11-15 01:32:54 +08:00
"只会简单编程,暂时只考虑不借助外在工具,完全使用 php 实现"

有点意思,放着简单好用的外部工具不用,自己去用 PHP 实现?

"打算弄辆车。只会做简单的手工,所以暂时只考虑不买车,完全手工制作一辆车出来"

我只能说,加油吧兄弟,希望你早日用 PHP 写一个 Redis 的雏形出来。
chinvo
2018-11-15 01:37:36 +08:00
@Actrace #21 tmp 不是内存,只是每次开机都会清理罢了,shm 才是内存
lihongming
2018-11-15 02:16:50 +08:00
为什么都推荐 redis 而不是 memcache ?
Canon1014
2018-11-15 08:43:43 +08:00
楼主意思应该是不想用其他技术 只靠简单 php 语法实现这个功能.
sagaxu
2018-11-15 08:53:08 +08:00
swoole 了解一下
encro
2018-11-15 08:54:49 +08:00
if file_exist("config.php")
$config = file_get_contents("config.php");
else
file_put_contents ("config.php",var_export($config));

假如你的 php 安装了 opcache 扩展的话,那么性能是非常高的
用 redis 是正确的选择
encro
2018-11-15 08:55:47 +08:00
另外 eacc,apcu,opcache 都有对象缓存了解下。
encro
2018-11-15 08:57:33 +08:00
假如你存文件,JSON 的性能可能还不如 mysql 的 memcache 表
xavier007
2018-11-15 09:03:43 +08:00
采用缓存,缓存加上过期时间,过期了重新查询更新缓存;
或者刚数据更新时触发更新缓存,前提数据更新不频繁
markgor
2018-11-15 10:46:34 +08:00
数据量不大的情况下,直接利用 serialize\unserialize 存进个文件就可以啦
数据量大就考虑下 redis
freewind
2018-11-15 11:08:43 +08:00
将数组生成一个 php 文件 file_put_contents ("config.php", "<?php $config =数组字符串; ?>");
修改的重新生成一下

其他文件 include
ferock
2018-11-15 11:26:52 +08:00
提了那么多建议,看到的还是楼主想用文件。
est
2018-11-15 11:28:42 +08:00
一个 redis 可能不够。用 rrrrreeeeeddddddiiiiiiissssssss 就够了。
gouchaoer2
2018-11-15 13:29:31 +08:00
用 apcu 方案最好
NEETLEE
2018-11-15 15:06:37 +08:00
写文件!
duzhenlin
2018-11-15 15:44:01 +08:00
写入文件,当量上来的是你会发现文件读取的 io 就跟不上了。可以考虑内存型缓存方式

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

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

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

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

© 2021 V2EX