Home >Backend Development >PHP Tutorial >如何只加载一次文件到变量中

如何只加载一次文件到变量中

WBOY
WBOYOriginal
2016-06-23 14:02:07964browse

应用场景是这样子的:
我有一个csv的文件,包含一些key-value的映射关系,一般情况下是不变的。
好几个不同的界面都需要使用这个文件中的数据,所以我想一次性加载,其它界面调用就行了。

我使用单例模式和_GLOBALS都不能保证load一次,每次刷新界面都load一次。

请问如何处理?


回复讨论(解决方案)

php是短连接,一次性加载然后读取不好做

存入session或者cookie中

写个方法读取csv文件内容,单例模式调用,不可行?

存入session或者cookie中

这个应该可以。

写个方法读取csv文件内容,单例模式调用,不可行?

我使用单例模式读取的数据放到了一个static变量里面。
但每次还是要load。

要load是什么意思?

要load是什么意思?

我设置了一个static的count变量,每次调用load_file的时候就打印一下。

在两个不同的界面上,
都打印
count = 1;

最好贴出代码看看。

最好贴出代码看看。

<?phpclass ***{    private $description;       private static $instance;                   private function __construct()    {    }    public static function get_instance()    {        if (!(self::$instance instanceof self)){            self::$instance = new self;        }        return self::$instance;    }    private function load_file()    {        static $index = 0;        // load data..        echo "load_file: ".$index."<br>";        $index ++;    }    public function get_data($key)    {        if (empty($this->description)) {            $this->load_file();        }        if (array_key_exists($key, $this->description))            return $this->description[$key];        return array();    }}?>

每次都打印
load_file: 0

$key, $this->description是否有值,有值的话,各是什么?

由于每次请求都是单独的进程,所以“普通变量”是无法共享的。可以将数据放置到可以统一访问的地方:
1.文件中(不就是你原来的文件么。。嘻嘻,其实可以存成k v数组,不必每次读取csv文件)
2.session中。
3.内存中(参考memcached、redis等内存缓存的原理,kv的常用存储)
4.数据库中。
5.其他可共享的storage中。
关键不在于是不是load一次。而在于load的性能。

$key, $this->description是否有值,有值的话,各是什么?

是有值的

由于每次请求都是单独的进程,所以“普通变量”是无法共享的。可以将数据放置到可以统一访问的地方:
1.文件中(不就是你原来的文件么。。嘻嘻,其实可以存成k v数组,不必每次读取csv文件)
2.session中。
3.内存中(参考memcached、redis等内存缓存的原理,kv的常用存储)
4.数据库中。
5.其他可共享的storage中。
关键不在于是不是load一次。而在于load的性能。

我想了想,还是放到session中把。load是调用fgetcsv得到数据。实际上数据也就400行左右,使用的人也不多,性能还可以。

如果存成k v数组的话,是放到$GLOBALS[]里面吗?因为好几个php文件都要用。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn