有一个进行数据运算的 PHP 页面,因为需要多次读取数据库,通常需要 2-3 分钟才能执行完毕,如果长期作为生产用途,会不会有什么隐患? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
turan12
V2EX    PHP

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

  •  1
     
  •   turan12 2018-04-23 14:43:29 +08:00 4352 次点击
    这是一个创建于 2741 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    30 条回复    2019-05-17 10:20:15 +08:00
    tegic
        1
    tegic  
       2018-04-23 14:52:14 +08:00
    内存消耗过大,应用蹦了咋整?
    gouchaoer
        3
    gouchaoer  
       2018-04-23 15:10:30 +08:00   1
    fpm 里面最好的是环境太方便了,你在执行长时间脚本的时候这样:
    set_time_limit(0);
    ini_set('memory_limit', '-1');
    ignore_user_abort(true);

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

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

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

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

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

    我之前的公司就这样做,主要是跑一些东西。
    turan12
        24
    turan12  
    OP
       2018-04-24 22:28:59 +08:00
    @swat199538
    @vincenttone
    确实是个实时统计的功能,而且在统计以后还需要进一步进行其它数据分析。
    vincenttone
        25
    vincenttone  
       2018-04-25 10:45:25 +08:00   1
    @turan12 即使是实时统计系统也可以做成异步处理,前提是你的数据变化是否频繁,不频繁可以展示的时候显示计算时间和数据变化时间,或者显示查询中之类,这都是产品问题了。
    还有就是你的查询八成是可以做成并行的,第一次或者 n 次的总查询完成后,可以多个线程并行。用的是 php 的话,可以考虑用 ev 扩展或者 swoole 之类的起并行。
    turan12
        26
    turan12  
    OP
       2018-04-25 12:00:03 +08:00
    @vincenttone 数据变化的还是很频繁的,基本是秒级。不过并行却是个很好的思路,之前没想到。
    vincenttone
        27
    vincenttone  
       2018-04-25 15:21:47 +08:00
    @turan12 嗯 并行的时候注意数据库连接的占用,尽量复用应该问题不大
    turan12
        28
    turan12  
    OP
       2018-04-25 16:12:46 +08:00
    @vincenttone 嗯,多谢提醒!
    han8gui
        29
    han8gui  
       2018-06-08 13:45:28 +08:00
    服用数据库实例的话,就没啥问题。
    swat199538
        30
    swat199538  
       2019-05-17 10:20:15 +08:00
    @turan12 我也推荐异步处理方式。前端等待结果就行了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     948 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 19:14 PVG 03:14 LAX 12:14 JFK 15:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86