Сохранение данных в файл или сохранение в БД MySQL - PullRequest
0 голосов
/ 30 ноября 2010

Используя PHP-скрипт, мне нужно обновлять число каждые 5 секунд, пока кто-то находится на моей странице. Допустим, у меня есть 300 посетителей, каждый из которых тратит около 1 минуты на странице, и каждые 5 секунд, которые они остаются на странице, число будет меняться ... что составляет в общей сложности 3600 изменений в минуту. Я бы предпочел обновить номер в моей базе данных MySQL, за исключением того, что я не уверен, если не слишком неэффективно иметь так много подключений MySQL (только для изменения одного номера), когда я могу просто изменить номер в файле.

P.S .: Я понятия не имею, 3600 подключений в минуту - это большое число или нет, но как насчет этого случая в целом, учитывая еще большее количество посетителей. Какой самый эффективный способ сделать это?

Ответы [ 6 ]

3 голосов
/ 30 ноября 2010

Выполнение 3600 операций чтения и записи в минуту для одного и того же файла исключено.Это сложно (нужно быть очень осторожным с блокировкой файлов), оно будет иметь ужасную производительность и рано или поздно ваши данные будут повреждены.

СУБД, такие как MySQL, предназначены для одновременного доступа.Если они не справятся с вашей нагрузкой, файл не справится с этим лучше.

1 голос
/ 30 ноября 2010

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

Использование СУБД - самый простой подход.

Для более эффективного, но в целом более эзотерического подхода напишите однопотоковый демон сокет-сервера и попросите клиентов подключиться к нему. (здесь есть lib для обработки сокетов, и PEAR класс для запуска PHP в качестве демона)

1 голос
/ 30 ноября 2010

Если вы сохраняете в файл, вы должны решить проблемы параллелизма (и все, кроме текущего процесса чтения / записи, должны будут ждать). БД решает это для вас. Для лучшей производительности вы можете использовать memcached.

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

1 голос
/ 30 ноября 2010

файлы не являются транзакционными, и вы не хотите терять счет, так что база данных - это путь

Команда inc memcached быстрее, чем база данных, и я думаю, что это была одна из очень быстрых установок подсчета просмотров

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

1 голос
/ 30 ноября 2010

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

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

Если вам не нужно, чтобы он был транзакционным (порядок выполнения запроса не важен), тогда я предлагаю вам использовать memcached (или redis, если вам нужно сохранить данные на диске) вместо этого

0 голосов
/ 30 ноября 2010

Использование выделенного временного файла, безусловно, будет наиболее эффективным доступом к диску. Однако вы не будете защищены от одновременного доступа к файлу, если ваш сервер использует несколько потоков или процессов. Если вы хотите обновить 1 число для каждого пользователя, тогда подкаталог $ _SESSION будет работать, и я считаю, что он хранится в памяти, поэтому он должен быть очень эффективным. Затем вы можете легко сохранять этот номер в своей базе данных каждые 5 минут для каждого пользователя

...