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

2018-04-23 14:43:29 +08:00
 turan12

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

3707 次点击
所在节点    PHP
30 条回复
tegic
2018-04-23 14:52:14 +08:00
内存消耗过大,应用蹦了咋整?
a308057848
2018-04-23 15:03:40 +08:00
建立好数据库连接池
gouchaoer
2018-04-23 15:10:30 +08:00
fpm 里面最好的是环境太方便了,你在执行长时间脚本的时候这样:
set_time_limit(0);
ini_set('memory_limit', '-1');
ignore_user_abort(true);

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/449130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX