我如何异步地每5秒在PHP中执行一次api调用

时间:2016-11-28 23:58:30

标签: javascript php ajax

我正在开发一个实时评分网站,我的目标是每5秒刷新一次API请求并将其缓存(因为我每小时只有1000个请求)并根据该网站更新部分网站每5秒更改一次API。

API请求在PHP中完成,数据的排序也是如此。但是,我一直在努力实现API请求的更新部分。我希望我的API请求在后台更新,并且一些JavaScript以5秒为基础更新网站,这样我就可以每5秒获取一次新数据。

我很乐意得到一些帮助。我想在CRON中做一些事情,但是主机并不提供每5秒运行一次CRON。我问题的任何解决方案?

3 个答案:

答案 0 :(得分:1)

你可以在没有cron的情况下完成。像这样的东西会起作用:

  • 用户的浏览器向您的API发送请求;
  • 您的API检查缓存中是否存在值(Memcached?),如果存在,则从缓存中提供服务;
  • 如果没有缓存条目,您的API会发出传出请求,排序/处理回复,然后将其缓存,过期时间为5秒以上

与cron解决方案相比的优势 - 如果您的网站上没有活跃用户,则没有不必要的传出请求。

您也可以考虑在浏览器端使用websockets。

答案 1 :(得分:0)

最简单的方法就是在无限循环中运行php脚本,而不是每隔5秒重新运行一次。

类似的东西:

#!/usr/bin/env php
<?php

while (true) {
  CacheStuff();
  sleep(5);
}

然后使用像flock这样的东西在cron中触发它以防止它运行多次。

* * * * * flock -n /var/lock/cache_script.lock /path/to/myscript.php

答案 2 :(得分:0)

我的假设: 你没有机会获得cron,memcached,redis等(基本托管问题)

<强>样品 您可以将数据作为json对象保存到文件中。

例如您的文件名是“5min-data.json”

所以你的代码可以;

$timeout_sec = 5;
$file_path = '5min-data.json';
if (file_exists($file_path) && ((filemtime($file_path) - time()) < ($timeout_sec * 60))) {
    $data = json_decode(file_get_contents($file_path), true);
}
else {
    //produce your data here as array, it is only sample
    $data = [
        'brand' => 'Mazda',
        'model' => 'Mzd3',
        'year' => 2016,
        'weight' => 1234.5,
        'airbags' => [
            'front-left',
            'front-right',
            'back-left'
        ]
    ];
    file_put_contents ($file_path, json_encode($data));
}
//$data is fresh