【问题标题】:Using a cronjob to update and display results of a MySQL query使用 cronjob 更新和显示 MySQL 查询的结果
【发布时间】:2015-10-15 15:07:19
【问题描述】:

我有一些麻烦,我怎么能意识到它有一个动态网站,其中数据是通过 ajax 获取给用户的。

在 ajax 的末尾是一个简单的 php 脚本,它打开一个 MySQL 连接到我的数据库并获取一些结果(对于所有用户来说都是相同的,没有任何用户特定的结果),例如稍后显示它们在表格中。

这就是我到目前为止所做的。它正在工作,但是当有成千上万的用户打开网站时......这不会很好,我认为我的服务器不会足够快地更新它。

因此,我的意图是每 x 秒使用 cronjob 在服务器端更新一次想要的结果,这可能会节省很多资源。

问题是我不知道如何实现这部分,我能得到一些帮助吗?还是我应该忘记 ajax 的东西并开始使用 node.js?

我有一个非常好的根服务器,它也是我的网站空间,因此可以安装一些额外的应用程序。

【问题讨论】:

  • 如果您想每 x 分钟显示一次相同的结果 - 为什么不缓存它们,并在需要时刷新?这样,您只需要这个 ajax 调用来保存数据,即使有很多用户同时访问该站点也足以让 mysql 处理。但是,您的问题仍然不清楚 - node.js 与 ajax 有什么关系?你想显示什么样的结果?

标签: php html mysql ajax node.js


【解决方案1】:

您可以使用 Memcache(或类似的东西)缓存数据。您的 cronjob 可以根据需要运行并刷新缓存。

然后您的 AJAX 可以调用一个简单的 PHP 脚本从缓存中检索数据。

【讨论】:

    【解决方案2】:

    使用memory-cachenode-cron 的真正基本的Node.js 解决方案:

    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);
                });
            }
        });
    });
    

    【讨论】:

    • 嗨 remus,感谢您的快速答复。此示例是否会在每个用户上每 5 秒缓存一次数据?所以每个用户都会看到另一个用户的更新延迟(即使只是一秒钟)?
    • 嗯,这取决于你如何设置它。缓存 ID 用于标识缓存实例。您声称每个用户的数据都是相同的 - 如果您使用共享缓存 ID 设置它,那么无论哪个用户发出请求,他们都会获得缓存的结果。如果您使用用户 ID 作为缓存 ID 存储它,那么它将为每个用户单独缓存。
    • 应该显示 100% 相同的数据。例如一个基本的聊天,每个用户都应该看到缓存的结果(我们用 ajax 显示),但是当它取决于何时更新缓存(每 5 秒)时,用户是无关紧要的。所以我几乎不能在没有任何 MySQL 查询的情况下每纳秒进行一次 ajax(用户带宽越好,他获得更新的速度越快,几乎是实时的.. 不是吗?)我不能控制 CronJob 服务器端而不是由每个用户控制吗?如果我理解错了,我很抱歉。
    • 这是一个服务器端示例 - 您托管包裹在 Node.js 中的缓存并将缓存提供给任何用户以发出请求。
    • 好的,现在我明白了。但是等一下,当我使用 Node.js 更新缓存结果时,难道没有更好的方法来强制向用户刷新结果,而不是运行我的 'user -> php -> ajax -> result '?就像 Node.js 在此示例中与用户交谈一样:'Node.js -> user -> result'?我希望您不会觉得奇怪,但我会尝试对此有更多了解,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多