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

有一个进行数据运算的 PHP 页面,因为需要多次读取数据库,通常需要 2-3 分钟才能执行完毕,如果长期作为生产用途,会不会有什么隐患?

  •  1
     
  •   turan12 · 32 天前 · 1592 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个程序不会调用的太频繁,但就是需要花费几分钟时间(可能需要进行数千次 MySQL 查询)。而且随着数据量的增加,需要花费的时间可能会更长一些。不知道像这种需要花费一定时间才能执行完毕的 PHP 页面会不会给服务器或程序带来各种问题?如果会的话顺便求个解决方案。

    28 回复  |  直到 2018-04-25 16:12:46 +08:00
        1
    tegic   32 天前
    内存消耗过大,应用蹦了咋整?
        3
    gouchaoer   32 天前   ♥ 1
    fpm 里面最好的是环境太方便了,你在执行长时间脚本的时候这样:
    set_time_limit(0);
    ini_set('memory_limit', '-1');
    ignore_user_abort(true);

    这时候 fpm 会完全被占用,并发多了会有问题,如果你有 redis 的话可以通过 redis 控制并发;没有的话 mysql 有个 get_lock 控制并发。。。另外很重要的一点就是你需要实时拿到结果,在数据运算的 loop 中你把中间信息存到一张 mysql 表中,然后页面上 ajax 去实时读取进度

    我这个方案是实战经过检验的
        4
    gouchaoer   32 天前
    如果另外弄一个 php-cli 的 cron 那杨维持这个环境才麻烦
        5
    laxenade   32 天前 via Android   ♥ 1
    我觉得你首先应该想一下怎么优化代码,毕竟一直下去,天知道服务器和数据库抗不扛得住。
        6
    leven87   32 天前 via Android   ♥ 1
    这种是定时任务吧 一般放在凌晨执行。数据量大的话,可以考虑把表和数据复制一份到线下。这样就对线上没有任何影响了
        7
    lihongjie0209   32 天前
    如果我一直访问这个页面, 你的服务器是不是就爆了?
        8
    jswh   32 天前
    后台定时脚本,结果写入文件,页面读文件内容
        9
    2ME   32 天前
    最近重构项目源代码 有和你类似的定时脚本 用的是 gouchaoer 的方法(因为我发现这帖子没 2 楼 不敢说是几楼)

    控制并发 大概几分钟跑完 几千条甚至上万条 sql 原来没控制并发的时候内存爆掉是常事

    不过我读了他代码发现是代码太烂了 其实四五条 sql 就能查完 改完之后几秒就完事了

    首先你要检查你的 sql 是不是有问题 然后在考虑用楼上的方法
        10
    liyaojian   32 天前
    楼上提醒才发现没有这个帖子没有 2 楼,bug 吗?
        11
    Dawnki   32 天前 via iPhone   ♥ 1
    耗时较长的任务还是用异步队列吧,可以参考 laravel queue.守护一个后台处理脚本,用户请求了就立即返回,等用户下次调用查看结果请求
        12
    lsido   32 天前 via iPhone
    竟然没人推荐用 python 做,不符合 v 站逻辑
        13
    mingyun   32 天前
    分开队列处理吧
        14
    turan12   32 天前
    @gouchaoer 看起来不错,等我试试。
        15
    turan12   32 天前
    @lihongjie0209 我也担心这个问题。不过好在这个页面是在后台管理里调用的,而且权限设定的较高,一般一天只会调用 1-2 次。
        16
    turan12   32 天前
    @lsido 我还真的想过把这个功能单独提出来用 Python 重写。
        17
    wenzhoou   32 天前 via Android
    严重怀疑处理逻辑有问题。江湖老中医也得找到病根了再下药不迟。
        18
    niubee1   31 天前   ♥ 1
    随着数据量的增加,需要花费的时间可能会更长一些.... 从这句看来业务设计上有很大的问题呀
        19
    startar   31 天前 via Android
    用任务队列做
        20
    HarveyDent   31 天前
    你想想怎么把 1000 次查询的 SQL 该写成几条吧。
        21
    swat199538   31 天前
    这个是干嘛的做系统维护工作的?维护工作写定时脚本在 CLI 里面执行呀。
        22
    vincenttone   31 天前
    八成是个统计逻辑,写个定时统计就可以了吧。队列或者 crontab 就可以了。
        23
    abccccabc   31 天前
    4 楼的方案行得通。

    我之前的公司就这样做,主要是跑一些东西。
        24
    turan12   31 天前
    @swat199538
    @vincenttone
    确实是个实时统计的功能,而且在统计以后还需要进一步进行其它数据分析。
        25
    vincenttone   30 天前   ♥ 1
    @turan12 即使是实时统计系统也可以做成异步处理,前提是你的数据变化是否频繁,不频繁可以展示的时候显示计算时间和数据变化时间,或者显示查询中之类,这都是产品问题了。
    还有就是你的查询八成是可以做成并行的,第一次或者 n 次的总查询完成后,可以多个线程并行。用的是 php 的话,可以考虑用 ev 扩展或者 swoole 之类的起并行。
        26
    turan12   30 天前
    @vincenttone 数据变化的还是很频繁的,基本是秒级。不过并行却是个很好的思路,之前没想到。
        27
    vincenttone   30 天前
    @turan12 嗯 并行的时候注意数据库连接的占用,尽量复用应该问题不大
        28
    turan12   30 天前
    @vincenttone 嗯,多谢提醒!
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1352 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 17ms · UTC 16:42 · PVG 00:42 · LAX 09:42 · JFK 12:42
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1