2015-07-24 4 views
0

У меня возникли проблемы с тем, как я мог понять, что у него есть динамический веб-сайт, на котором данные извлекаются пользователем через ajax.Использование cronjob для обновления и отображения результатов запроса MySQL

В конце ajax есть простой скрипт php, который открывает соединение MySQL с моим db и извлекает некоторые результаты (который выглядит для всех пользователей одинаковым, нет конкретных пользовательских результатов), чтобы отображать их позже для пример в таблице.

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

Таким образом, я намерен обновить желаемые результаты только один раз каждые х секунд, на которых размещена поддержка cronjob, возможно, я бы сэкономил много ресурсов.

Проблема в том, что я не знаю, как я мог реализовать эту часть, могу ли я, пожалуйста, помочь? Или я должен забыть материал ajax и начать использовать node.js?

У меня есть неплохой корневой сервер, который также является моим веб-пространством, поэтому можно было бы установить некоторые дополнительные приложения.

+0

Если вы хотите отображать одни и те же результаты каждые x mins - почему бы не кешировать их и не обновлять, если необходимо? Таким образом, все, что вам понадобится, - это вызов ajax для сохранения данных, который даже с большим количеством пользователей, попадающих на сайт одновременно, будет достаточным для обработки mysql. Тем не менее, ваш вопрос до сих пор не ясен - что node.js связано с ajax? Какие результаты вы хотите отобразить? – eithed

ответ

1

Действительно базовое решение Node.js с использованием memory-cache и node-cron:

var cache = require('memory-cache'); 
var CronJob = require('cron').CronJob; 

var job; 
var jobStarted = false; 
var rateLimitExceeded = false; 

var job = new CronJob('5 * * * * *', function() { 
    // Runs every 5 seconds 
    doALongDataBaseOperation(function(err, data) { 
     cache.put('cacheId', data); 
    }); 
}); 

app.get('/path/that/needs/caching', function(req, res) { 
    cache.get('cacheId', function(e, data) { 
     if (data) { 
      res.end(data); 
     } else { 
      // contingency in case the cache doesn't exist 
      doALongDataBaseOperation(function(err, data) { 
       res.end(data); 
       cache.put('cacheId', data); 
      }); 
     } 
    }); 
}); 
+0

Привет, спасибо, за этот быстрый ответ. Будет ли этот пример кэшировать данные каждые 5 секунд для каждого пользователя? Итак, каждый пользователь увидит, что обновление задерживается у другого пользователя (даже если это всего лишь секунда)? – Menju

+0

Ну, это зависит от того, как вы его настроили. Идентификатор кэша идентифицирует экземпляр кэша. Вы утверждаете, что это одни и те же данные для каждого пользователя - если вы настроили его с общим идентификатором кэша, то независимо от того, какой пользователь делает запрос, они получат кешированные результаты. Если вы сохранили его с использованием идентификатора пользователя в качестве идентификатора кеша, то он будет кэшироваться отдельно для каждого пользователя. – brandonscript

+0

Это 100% те же данные, которые должны быть показаны. Например, базовый чат, где каждый пользователь должен видеть кешированные результаты (которые мы показываем с помощью ajax), но пользователь не имеет значения, когда зависит от того, когда нужно обновлять кеш (каждые 5 секунд). Таким образом, я едва могу атаковать каждые наносекунды без каких-либо запросов MySQL (чем лучше пропускная способность пользователей, тем быстрее он получает обновление, почти живет .. не так ли?) Не могу ли я управлять сервером CronJob, а не контролироваться каждым пользователем? Извините, если я понимаю что-то не так. – Menju

0

Вы можете кэшировать данные с помощью Memcache (или что-то подобное). Ваш cronjob может запускать и обновлять кеш так часто, как хотелось бы.

Тогда ваш AJAX может вызвать простой PHP-скрипт для извлечения данных из вашего кеша.

Смежные вопросы