我有一个用PHP构建的Web应用程序,Zend在LAMP堆栈上。我有一个4000字的列表,我需要加载到内存中。单词有类别和其他属性,我需要每次加载整个集合。想想一个字典对象。
存储快速召回的最佳方法是什么?一个包含XML,JSON或序列化对象的平面文件?一个包含大量XML,JSON或序列化对象的数据库记录?或者数据库表中有4000条记录?
我意识到不同的服务器配置会有所作为,但是假设一个开箱即用的共享主机方案,或本地WAMP或其他一些简单的设置。
答案 0 :(得分:10)
如果你正在使用APC(或类似的),你最快的结果可能是将单词列表直接编码到PHP源文件中,然后只需要require_once()'。
答案 1 :(得分:5)
在理想的系统中,我会说内存(memcached),磁盘和数据库。但是根据设置,数据库可能比磁盘快几倍,因为结果可能会粘在查询缓存中。
这完全取决于环境;如果这是至关重要的,你应该测量它。否则将它放在您认为更容易接近的地方。
答案 2 :(得分:3)
我将它放在一个可以缓存的文件中,在(或者甚至每个?)页面加载上节省了大量不必要的数据库调用。你如何存储它并不重要,无论什么最适合你。速度方面,4000字应该不是问题。
对于我工作的项目中的翻译,我总是使用包含序列化php-data的语言文件,这些文件很容易检索:
$text = unserialize(file_get_contents('/language/en.phpdata'));
答案 3 :(得分:3)
将列表格式化为PHP源并包含它。
如果做不到这一点,请问自己,加载的速度是否真的很重要。 4000字并不是那么多。
答案 4 :(得分:1)
如果你一直需要所有4000内存,那就无法查询数据库,尽管我可能错了。序列化对象听起来很简单,我认为它可以在这么多单词上表现得很好。
答案 5 :(得分:1)
如果你能够使用 memcached ,使用上述任何方法创建一次数组,将其发送到memcached,然后从那里重用它可能是最快的。查看Can you store a PHP Array in Memcache的答案以获取示例。基本上它看起来像这样:
$cache = new Memcache;
$cache->connect('localhost', 11211) or die ("Could not connect");
$cache->set('words', $myarray);
并得到它:
$myarray = $cache->get('words');
答案 6 :(得分:0)
如果你打算将单词列表序列化为XML / JSON,那么只需使用一个文件。我认为更自然的方法是将列表包含在PHP源代码中。
如果该列表发生变化,您将可以更灵活地使用数据库。
答案 7 :(得分:0)
如果您只是需要知道哪一个更快,我将使用数据库。除了速度之外,使用DB更安全,更易于使用。但是,要小心使用正确的数据类型,如ntext(MS-SQL服务器)或BLOB(oracle)。
答案 8 :(得分:0)
我遇到了类似的问题,并为此进行了一些测试。 以下是25 000个循环的时间安排:
从DB:9.03s中读取一个长文本 阅读一个文件:6.26s 包含php文件,其中包含文本的变量:12.08s
也许最快的方法是使用任何这些选项读取这些数据(一次,在重启服务器之后)并创建存储在内存中的数据库(存储引擎:内存),但它可能很少复杂,所以我会更喜欢“从文件中读取”选项。