в PHP, что быстрее - чтение файла или вызов базы данных? - PullRequest
12 голосов
/ 07 октября 2010

У меня есть веб-приложение, построенное на PHP с Zend в стеке LAMP.У меня есть список из 4000 слов, которые мне нужно загрузить в память.У слов есть категории и другие атрибуты, и мне нужно каждый раз загружать всю коллекцию.Подумайте об объекте словаря.

Какой лучший способ сохранить его для быстрого вызова?Плоский файл с чем-то вроде XML, JSON или сериализованного объекта?Запись в базе данных с большой частью XML, JSON или сериализованного объекта?Или 4000 записей в таблице базы данных?

Я понимаю, что различные конфигурации сервера будут иметь значение, но предполагают готовый план общего хостинга, или локальный WAMP, или некоторую другую простую настройку.

Ответы [ 9 ]

10 голосов
/ 07 октября 2010

Если вы используете APC (или аналогичный), самым быстрым результатом, вероятно, будет кодирование списка слов непосредственно в исходный файл PHP, а затем просто require_once () его использование.

5 голосов
/ 07 октября 2010

В идеальной системе я бы сказал, память (memcached), диск и база данных.Но в зависимости от настройки база данных может быть в несколько раз быстрее, чем диск, потому что результат может остаться в кеше запросов.

Все зависит от среды;и если это так важно, вы должны измерить это.В противном случае разместите его там, где вы считаете его более доступным.

3 голосов
/ 07 октября 2010

Отформатируйте список как источник PHP и включите его.

Если это не удастся, спросите себя, действительно ли это важно, как быстро это будет загружаться. 4000 слов не так уж много.

3 голосов
/ 07 октября 2010

Я бы поместил его в файл, который можно кэшировать, что избавит вас от множества ненужных обращений к базе данных при загрузке страницы (или, возможно, даже при каждом?).Как вы храните это не имеет значения, все, что работает лучше для вас.С точки зрения скорости, 4000 слов не должны быть проблемой вообще.

Для переводов в проектах, над которыми я работаю, я всегда использую языковые файлы, содержащие сериализованные php-данные, которые просто получить:

$text = unserialize(file_get_contents('/language/en.phpdata'));
1 голос
/ 23 августа 2014

, если вы можете использовать memcached , создание массива один раз с использованием любого из перечисленных выше методов, отправка его в memcached, а затем его повторное использование, вероятно, наиболее быстрое. Проверьте ответ Можете ли вы сохранить массив PHP в Memcache для примера. В основном это будет выглядеть так:

$cache = new Memcache;
$cache->connect('localhost', 11211) or die ("Could not connect");
$cache->set('words', $myarray);

и получить его:

$myarray = $cache->get('words');
1 голос
/ 07 октября 2010

Если вам нужно все 4000 в памяти все время, это побеждает цель запроса базы данных, хотя я могу ошибатьсяСериализованный объект звучит достаточно просто, и я думаю, что он будет хорошо работать с таким количеством слов.

0 голосов
/ 06 апреля 2012

У меня была похожая проблема, и я выполнил для нее тест.Вот время для 25 000 циклов:

Чтение одного длинного текста из БД: 9.03s Чтение одного файла: 6.26s Включение файла php, где переменная содержит текст: 12.08s

Самый быстрый способ - прочитать эти данные (один раз, после перезапуска сервера) с помощью любого из этих параметров и создать базу данных, хранящуюся в памяти (механизм хранения: память), но это может быть немного сложным, поэтому я бы предпочел «читать из файла».вариант.

0 голосов
/ 07 октября 2010

Если вам просто нужно узнать, какой из них быстрее, я пойду с БД. В дополнение к скорости, использование БД безопаснее и проще в использовании. Но будьте осторожны, чтобы использовать правильный тип данных, например, ntext (сервер MS-SQL) или BLOB (оракул).

0 голосов
/ 07 октября 2010

Если вы все равно собираетесь сериализовать список слов как XML / JSON, просто используйте файл. Я думаю, что более естественный подход заключается в том, чтобы включить список в исходный код PHP.

Если этот список изменится, у вас будет больше гибкости с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...