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

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

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

    这个程序不会调用的太频繁,但就是需要花费几分钟时间(可能需要进行数千次 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 我也担心这个问题。不过好在这个页面是在后台管理里调用的,而且权限设定的较高,一般一天只会调用 1-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   ·   实用小工具   ·   2743 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:58 · PVG 19:58 · LAX 03:58 · JFK 06:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.