в PHP, что быстрее-чтение файла или вызова базы данных?
У меня есть веб-приложение, встроенное в PHP с Zend на стеке лампы. У меня есть список из 4000 слов мне нужно загрузить в память. Слова имеют категории и другие атрибуты, и мне нужно загружать всю коллекцию каждый раз. Подумайте об объекте словаря.
каков наилучший способ сохранить его для быстрого вызова? Плоский файл с чем-то вроде XML, JSON или сериализованного объекта? Запись базы данных с большим куском XML, JSON или сериализованным объектом? Или 4000 записей в базе данных стол?
Я понимаю, что разные конфигурации сервера будут иметь значение, но предположим, что из коробки общий план хостинга, или WAMP локально или некоторые другие простые настройки.
9 ответов
Если вы используете APC (или аналогичный), ваш самый быстрый результат, вероятно, будет кодировать список слов непосредственно в исходный файл PHP, а затем просто require_once ()'ing его.
в идеальной системе я бы сказал, память (memcached), диск и база данных. Но в зависимости от настройки база данных может быть в нескольких случаях быстрее, чем диск, потому что результат может застрять в кэше запросов.
все зависит от окружающей среды; и если это критично, вы должны измерить его. В противном случае поместите его туда, где вы считаете его более доступным.
Я бы поместил его в файл, который можно кэшировать, экономя много ненужных вызовов базы данных (или, может быть, даже каждый?) загрузка страниц. Как вы храните это не имеет значения, что лучше всего работает для вас. С точки зрения скорости, 4000 слов вообще не должно быть проблемой.
для переводов в проектах, над которыми я работаю, я всегда использую языковые файлы, содержащие сериализованные php-данные, которые просто легко получить:
$text = unserialize(file_get_contents('/language/en.phpdata'));
отформатируйте список как источник PHP и включите его.
в противном случае спросите себя, действительно ли важно, как быстро это загрузится. 4000 слов-это не так уж много.
Если вам нужно все 4000 в памяти все время, это побеждает цель запроса базы данных, хотя я могу ошибаться. Сериализованный объект звучит достаточно просто, и я думаю, что он будет хорошо работать с этим количеством слов.
Если вы можете использовать memcached, создание массива один раз с использованием любого из методов выше, отправка его в memcached, а затем повторно использовать его оттуда, вероятно, быстрее. Проверьте ответ можете ли вы сохранить массив PHP в Memcache для примера. В основном это будет выглядеть так:
$cache = new Memcache;
$cache->connect('localhost', 11211) or die ("Could not connect");
$cache->set('words', $myarray);
и чтобы получить его:
$myarray = $cache->get('words');
Если вы все равно собираетесь сериализовать список слов как XML/JSON, просто используйте файл. Я думаю, что более естественным подходом является включение списка в источник PHP.
Если этот список изменится, у вас будет больше гибкости с базой данных.
Если вам просто нужно знать, какой из них быстрее, я иду с DB. В дополнение к скорости, использование БД безопаснее и проще в использовании. Но будьте осторожны, чтобы использовать правильный тип данных, например ntext (MS-SQL server) или BLOB (oracle).
У меня была аналогичная проблема и запустить некоторый тест для нее. Вот тайминги для 25 000 петель:
прочитайте один длинный текст из DB: 9.03 s Читать один файл: 6.26 s Включите php-файл, где находится переменная, содержащая текст: 12.08 s
возможно, самым быстрым способом было бы прочитать эти данные (один раз, после перезагрузки сервера) с любой из этих опций и создать базу данных, хранящуюся в памяти (storage engine: memory), но это может быть немного сложно, поэтому я бы предпочел " читать из файла" выбор.