Файл с базой данных для эффективности хранения в приложении чата

Я работаю над простым дополнением чата AJAX для своего PHP-приложения, чтобы я мог предоставлять пользователям в режиме реального времени поддержку. В настоящее время я использую базу данных MySQL, хранящую текст, временную метку и user_id человека, который беседует. Мне нужно подумать о том, как я могу оптимизировать свой чат, и мне нужно подумать об устранении необходимости в базе данных SQL.

Мой вопрос: было бы более эффективно использовать fwrite() для добавления дополнительных данных в файл PHP для хранения той же информации, а не для создания соединения SQL для получения новых сообщений в чате? Я знаю, как бы я это сделал эффективно, я просто пытаюсь выяснить, какой путь будет более эффективным.

Я немного посмотрел на SQLite; будет ли это лучшей альтернативой, чем использование базы данных MySQL?

Системы управления базами данных (СУБД) существуют, потому что это не так просто, как кажется, правильно хранить и получать доступ к данным.

Хранение данных в файле подразумевает проблемы параллелизма доступа. Когда файл станет больше, вам придется столкнуться с важным использованием памяти или написать много кода для загрузки именно того, что вам нужно. Также будет довольно сложно выполнять базовые операции, такие как фильтрация ( WHERE SQL WHERE ) или обновление строки. BTW, изменение структуры данных обещает быть подверженным ошибкам. Я простенькие слова: вам придется писать много кода и сталкиваться с множеством ошибок.

ИМО, не используя какой-либо СУБД, воссоздает колесо. Однако важно выбрать правильный.

Я брошу свою шляпу на ринг здесь, хотя это старый вопрос. Для скорости, надежности и простоты использования БД является очевидным легким выбором … С одной большой оговоркой, которую многие люди упускают из виду, и это наиболее общие хосты (наиболее распространенная форма веб-хостинга), позволяют только 15 или поэтому соединения сразу, даже VPS, как правило, позволяют только 100-200, выделенные 500 или более. Это означает, что если у вас есть (n) пользователей, которые собирают каждую секунду, эти соединения будут быстро съедаться, даже быстрее, если вы также запускаете какой-либо CMS. Будучи посередине разработки моего собственного кода в чате на VPS, я тоже сталкиваюсь с этими проблемами.

Пока мой метод был таким.

  • Обязательно передайте переменную lastMessageReceived, чтобы ограничить ответ.
  • Если публичный чат передает фильтр временной метки, а также вышеупомянутый
  • если вообще возможно использовать механизм кэширования базы данных, такой как MySQLnd с включенным кэшированием запросов, и TTL устанавливается в зависимости от вашей скорости объединения.
  • Не сходите с ума по скорости объединения. 1-2 секунды интервалы могут показаться аккуратными и быстрыми, но это убьет ваш счет соединения. Снижение этого до 5 с или даже больше не приведет к огромным различиям, и пользователи, вероятно, не заметят, и загрузка вашего сервера будет намного легче. Даже рассмотрите переменную скорость объединения, которая возникает при высокой нагрузке.
  • Напишите ваш ajax для использования тайм-аута вместо интервала для его объединения и поместите вызов тайм-аута в обратный вызов ajax-success, это предотвратит укладку запросов во время пиковой загрузки.
  • И самый большой, если вы используете общий чат с множеством пользователей, пишите свой собственный код для кэширования SQL-запроса в json-файл и подавайте его на ajax-запросы и пишите какой-то пользовательский TTL-код, чтобы проверить его возраст и повторно заполнить его по мере необходимости во время запросов, CRON будет отличным здесь, если ваш хост позволит. Возрастная проверка файла и перенаправление запроса AJAX на него – это функция более высокого уровня с очень небольшими накладными расходами сервера, особенно по сравнению с запросом на БД. И не анализируйте файл в PHP, который chat_243.json отфильтровать старые сообщения, сохраните файл с первым сообщением в имени файла, таким как chat_243.json и сохраните его как уже отформатированный json, а затем просто chat_243.json весь файл, если появится запрос в php с lastMessageReceived = 243 . Поскольку это создаст несколько файлов, вам понадобится функция очистки файлов старше (м) минут, но это также легкая работа для сервера.

Существуют также такие варианты, как БД-механизмы, предназначенные для чата и сокетов (node.js), но для них требуется больше настройки сервера, чем позволяют обычные учетные записи хостинга, для моих целей я пишу свою комнату в чате, имея в виду идею о том, что она может получить в какой-то момент развертывается на общем сервере.

Вот код, который я использую в настоящее время, и он в значительной степени позволил мне расширить мой чат до неограниченного количества соединений (в пределах полосы пропускания серверов)

 $cacheFile = 'cache/chat_'.$_GET['last'].'.json'; if (file_exists($cacheFile) && filemtime($cacheFile) + QUERY_REFRESH_RATE > time()) { readfile($cacheFile); } else { require_once("../../../../wp-load.php"); $timestampMin = gmdate("Ymd H:i:s", (time() - 7200)); $sql= "/*qc=on*/" . "SELECT * FROM ". DB_TABLE ."chat_posts WHERE ID > ". $_GET['last'] . " AND timestamp > '".$timestampMin."' ORDER BY ID;"; $posts = $wpdb->get_results($sql); $json = json_encode($posts); echo $json; file_put_contents($cacheFile,$json); } 

Если вы удалите или заархивируете старые разговоры, MySQL будет хорошим выбором. Не забудьте указать индексы на дату и пользователя, или идентификатор сеанса, чтобы вы могли быстро их восстановить.

Я бы придерживался MySQL, поскольку он больше подходит для множественного доступа из веб-приложения, чем простой файл.

Во-первых, используйте постоянные соединения.

При использовании этого я бы предложил использовать PDO, если вы еще этого не сделали. (Опция PDO для постоянных соединений – PDO :: ATTR_PERSISTENT => true)

Примечание. Значение по умолчанию в PHP – это просто эмулировать подготовленный оператор. Вы хотите, чтобы это был TRUE подготовленный оператор, поэтому установите PDO :: ATTR_EMULATE_PREPARES в 0. (http://bugs.php.net/bug.php?id=54638)

Кроме того: Подготовленные утверждения не будут использовать кеш MySQL в версиях до 5.1.17 и не будут кэшировать подготовленные переменные до 5.1.21, поэтому убедитесь, что у вас есть последняя версия MySQL.

PDO обеспечивает более чем потенциальное повышение производительности. Вы должны заглянуть, если вы этого еще не сделали. Подробнее о PDO здесь: http://ca2.php.net/manual/en/book.pdo.php

Поскольку другие затронули MySQL vs Text, я хотел бы дать вам альтернативу.

Эти приложения идеально подходят для решений noSQL, таких как MongoDB . Поскольку, скорее всего, вы будете опросить сервер с интервалом, что-то с очень быстрой возможностью чтения – хорошая идея.

Вы также можете использовать что-то вроде Node.JS, чтобы связать все это вместе.