Я работаю над простым дополнением чата AJAX для своего PHP-приложения, чтобы я мог предоставлять пользователям в режиме реального времени поддержку. В настоящее время я использую базу данных MySQL, хранящую текст, временную метку и user_id человека, который беседует. Мне нужно подумать о том, как я могу оптимизировать свой чат, и мне нужно подумать об устранении необходимости в базе данных SQL.
Мой вопрос: было бы более эффективно использовать fwrite()
для добавления дополнительных данных в файл PHP для хранения той же информации, а не для создания соединения SQL для получения новых сообщений в чате? Я знаю, как бы я это сделал эффективно, я просто пытаюсь выяснить, какой путь будет более эффективным.
Я немного посмотрел на SQLite; будет ли это лучшей альтернативой, чем использование базы данных MySQL?
Системы управления базами данных (СУБД) существуют, потому что это не так просто, как кажется, правильно хранить и получать доступ к данным.
Хранение данных в файле подразумевает проблемы параллелизма доступа. Когда файл станет больше, вам придется столкнуться с важным использованием памяти или написать много кода для загрузки именно того, что вам нужно. Также будет довольно сложно выполнять базовые операции, такие как фильтрация ( WHERE
SQL WHERE
) или обновление строки. BTW, изменение структуры данных обещает быть подверженным ошибкам. Я простенькие слова: вам придется писать много кода и сталкиваться с множеством ошибок.
ИМО, не используя какой-либо СУБД, воссоздает колесо. Однако важно выбрать правильный.
Я брошу свою шляпу на ринг здесь, хотя это старый вопрос. Для скорости, надежности и простоты использования БД является очевидным легким выбором … С одной большой оговоркой, которую многие люди упускают из виду, и это наиболее общие хосты (наиболее распространенная форма веб-хостинга), позволяют только 15 или поэтому соединения сразу, даже VPS, как правило, позволяют только 100-200, выделенные 500 или более. Это означает, что если у вас есть (n) пользователей, которые собирают каждую секунду, эти соединения будут быстро съедаться, даже быстрее, если вы также запускаете какой-либо CMS. Будучи посередине разработки моего собственного кода в чате на VPS, я тоже сталкиваюсь с этими проблемами.
Пока мой метод был таким.
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, чтобы связать все это вместе.