V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zictos
V2EX  ›  PHP

纯 PHP 能自动访问 api 更新数据吗?

  •  
  •   zictos · 2019-09-05 06:49:51 +08:00 · 5373 次点击
    这是一个创建于 1666 天前的主题,其中的信息可能已经有所发展或是发生改变。
    见过很多网站源码,都有自动更新数据的功能。
    但 php 正常情况下没人访问网站应该就不会运行,只有用户发送 http 请求的时候 php 才会执行,执行完了之后就马上退出了。

    那如果 php 没有后台运行的话是怎么做到自动更新数据的呢?我觉得网上的那些能自动更新数据的源码应该是没有使用系统的定时任务的,都是纯 php 实现的。
    34 条回复    2019-09-09 10:37:56 +08:00
    alect
        1
    alect  
       2019-09-05 07:02:57 +08:00
    crontab 啊。。定时执行:
    * * * * * /usr/bin/php73 -f /home/cron.php &> /dev/null
    alect
        2
    alect  
       2019-09-05 07:04:12 +08:00
    @alect #1 后面那句没看到。。你不去看怎么知道他更新了?你看了他不就能更新了?
    zictos
        3
    zictos  
    OP
       2019-09-05 07:14:59 +08:00
    @alect 也就是只能在用户访问网站的时候顺带更新吗?在 php 文件中加入一个条件判断,比如距离上次更新超过一定时间了就立刻更新。这样大多时候用户访问网站时是不会更新的,只有在超过一段时间没有更新,某个用户访问网站的时候 php 就会顺带执行更新,然后再退出。

    不过网上的那些源码真的是这样实现的吗?感觉他们好像不是这么弄的
    kopisee
        4
    kopisee  
       2019-09-05 07:15:16 +08:00 via Android
    像 Discuz! 是有人访问的时候把之前的定时任务执行,所以定时关帖这些功能实际关帖操作的时间跟设定的时间有差别。

    也可以用 cron-job.org 这种网站定时访问从而触发执行。
    icekingcy
        5
    icekingcy  
       2019-09-05 08:23:51 +08:00 via iPhone
    你在说 CLI 模式吗?
    jason56
        6
    jason56  
       2019-09-05 08:25:51 +08:00
    swoole 了解下
    xiaoriri666
        7
    xiaoriri666  
       2019-09-05 08:28:16 +08:00
    计划任务了解一下 linux 的计划任务就可以定时实现更新数据
    dyllen
        8
    dyllen  
       2019-09-05 09:02:29 +08:00
    有的网站,你访问他的时候,他会按照概率去触发定时任务,这就不需要做任何设置了。
    xnode
        9
    xnode  
       2019-09-05 09:08:14 +08:00
    有 好几种方法,
    第一种 cli 常驻内存执行
    第二种 定时任务 cli 访问
    第三种 定时任务 访问 curl url
    第四种 curl url 后 使用断开连接后 后台内存执行
    tanszhe
        10
    tanszhe  
       2019-09-05 09:09:42 +08:00
    while(true) {

    }
    zjsxwc
        11
    zjsxwc  
       2019-09-05 09:11:02 +08:00
    不用 crontab
    就纯 php cli 呗

    while(1) {
    //do something
    sleep(60);
    }
    explore365
        12
    explore365  
       2019-09-05 09:23:03 +08:00
    cli
    lllllliu
        13
    lllllliu  
       2019-09-05 09:25:19 +08:00
    @alect 薛定谔的 PHP
    lscho
        14
    lscho  
       2019-09-05 09:26:54 +08:00
    2 楼是正解啊,一些简单的任务不需要定时任务或者常驻后台。。既然数据是给人看的,那自然会有用户去访问,触发 webhook,更新一下数据就行了。
    liuxu
        15
    liuxu  
       2019-09-05 09:29:02 +08:00
    @lllllliu 别说 PHP,JAVA/PYTHON 也不行
    misaka19000
        16
    misaka19000  
       2019-09-05 09:32:05 +08:00
    PHP 是世界上最好的语言
    robinchina
        17
    robinchina  
       2019-09-05 09:33:04 +08:00
    我用 VB 定时执行 PHP···············win 系统··
    ben1024
        18
    ben1024  
       2019-09-05 09:35:18 +08:00
    其实还有个操作,访问时在调用定时任务
    Hanada
        19
    Hanada  
       2019-09-05 09:37:53 +08:00 via iPad
    随便找个在线云监控,定时访问某个页面出发不就好了么,例如阿里云监控最低能以每分钟的频率来触发
    Hanada
        20
    Hanada  
       2019-09-05 09:38:18 +08:00 via iPad
    出发=触发
    newtype0092
        21
    newtype0092  
       2019-09-05 10:10:00 +08:00
    我不要你觉得,我要我觉得,我觉得他们就是用 crontab 了。
    alexmy
        22
    alexmy  
       2019-09-05 10:24:56 +08:00
    配合 crontab 刷数据,做统计多好。
    linxl
        23
    linxl  
       2019-09-05 10:28:10 +08:00
    没人访问不更新也没有问题啊...
    既然都没人访问了, 实际上定时任务没执行你也不知道啊
    linxb
        24
    linxb  
       2019-09-05 10:31:24 +08:00
    上 swoole,用毫秒定时器定时更新
    tongz
        25
    tongz  
       2019-09-05 11:12:33 +08:00
    程序在客户机安装的时候 shell_exec 创建一个 crontab 任务
    zyy314680012
        26
    zyy314680012  
       2019-09-05 11:46:14 +08:00 via Android
    windows 计划任务 Linux crontab
    zhengwenk
        27
    zhengwenk  
       2019-09-05 12:13:00 +08:00
    `我觉得网上的那些能自动更新数据的源码应该是没有使用系统的定时任务的,都是纯 php 实现的。`

    为什么你会觉得都是 php 实现的,依据何在?
    gz911122
        28
    gz911122  
       2019-09-05 12:32:45 +08:00
    @liuxu
    java 怎么不行?
    liuxu
        29
    liuxu  
       2019-09-06 09:20:18 +08:00
    @gz911122 你要说行那其实所有语言都能行
    gz911122
        30
    gz911122  
       2019-09-06 10:43:38 +08:00
    @liuxu 不是,我没听明白你什么意思?
    能正面说明下吗?
    liuxu
        31
    liuxu  
       2019-09-06 17:05:15 +08:00
    @gz911122 以标准 B/S 请求触发,php/java/python 作为 Server,这种非主动执是不能完成自动更新的。但如果没有这个限制,即使不依赖其他程序定时执行,只需要语言自己开发 daemon 进程程序也能完成
    Mitt
        32
    Mitt  
       2019-09-08 00:12:33 +08:00
    首先 PHP 写个入口去执行 cron 操作,然后 cron 执行完后在避免 PHP 超时的情况下使用 curl 再访问一遍这个入口,相当于起线程一样的,访问完以后不等待结果直接取消,这样另一个线程也会继续执行 cron,这个线程就可以退出了,然后 cron 遍历可以设置 while 循环,在不触发 PHP 超时杀死的情况下可以一直跑,直到快超时了就用这个方法去开启新的线程来循环跑 cron, 在执行 cron 的时候可以定时写入文件时间或者其他方法来记录你这个 cron 还活着,然后用户访问网站的时候去检查一遍 cron 是否活着,死了就用上述方法去激活,这种方法虽然不稳定但是也确实符合你的要求,可以最低限度修改 PHP 配置就实现。
    ETO
        33
    ETO  
       2019-09-09 10:36:35 +08:00
    @lllllliu 这跟 php 没什么关系,只是 linux 定时任务精度的问题吧?
    ETO
        34
    ETO  
       2019-09-09 10:37:56 +08:00
    swoole 了解吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1010 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:26 · PVG 03:26 · LAX 12:26 · JFK 15:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.