这个程序不会调用的太频繁,但就是需要花费几分钟时间(可能需要进行数千次 MySQL 查询)。而且随着数据量的增加,需要花费的时间可能会更长一些。不知道像这种需要花费一定时间才能执行完毕的 PHP 页面会不会给服务器或程序带来各种问题?如果会的话顺便求个解决方案。
1
tegic 2018-04-23 14:52:14 +08:00
内存消耗过大,应用蹦了咋整?
|
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 去实时读取进度 我这个方案是实战经过检验的 |
4
gouchaoer 2018-04-23 15:11:18 +08:00
如果另外弄一个 php-cli 的 cron 那杨维持这个环境才麻烦
|
5
laxenade 2018-04-23 15:13:38 +08:00 via Android 1
我觉得你首先应该想一下怎么优化代码,毕竟一直下去,天知道服务器和数据库抗不扛得住。
|
6
leven87 2018-04-23 15:22:37 +08:00 via Android 1
这种是定时任务吧 一般放在凌晨执行。数据量大的话,可以考虑把表和数据复制一份到线下。这样就对线上没有任何影响了
|
7
lihongjie0209 2018-04-23 15:25:46 +08:00
如果我一直访问这个页面, 你的服务器是不是就爆了?
|
8
jswh 2018-04-23 15:31:21 +08:00
后台定时脚本,结果写入文件,页面读文件内容
|
9
2ME 2018-04-23 15:34:26 +08:00
最近重构项目源代码 有和你类似的定时脚本 用的是 gouchaoer 的方法(因为我发现这帖子没 2 楼 不敢说是几楼)
控制并发 大概几分钟跑完 几千条甚至上万条 sql 原来没控制并发的时候内存爆掉是常事 不过我读了他代码发现是代码太烂了 其实四五条 sql 就能查完 改完之后几秒就完事了 首先你要检查你的 sql 是不是有问题 然后在考虑用楼上的方法 |
10
liyaojian 2018-04-23 20:59:29 +08:00
楼上提醒才发现没有这个帖子没有 2 楼,bug 吗?
|
11
Dawnki 2018-04-23 23:49:36 +08:00 via iPhone 1
耗时较长的任务还是用异步队列吧,可以参考 laravel queue.守护一个后台处理脚本,用户请求了就立即返回,等用户下次调用查看结果请求
|
12
lsido 2018-04-23 23:55:37 +08:00 via iPhone
竟然没人推荐用 python 做,不符合 v 站逻辑
|
13
mingyun 2018-04-23 23:59:56 +08:00
分开队列处理吧
|
15
turan12 OP @lihongjie0209 我也担心这个问题。不过好在这个页面是在后台管理里调用的,而且权限设定的较高,一般一天只会调用 1-2 次。
|
17
wenzhoou 2018-04-24 00:13:21 +08:00 via Android
严重怀疑处理逻辑有问题。江湖老中医也得找到病根了再下药不迟。
|
18
niubee1 2018-04-24 00:45:42 +08:00 1
随着数据量的增加,需要花费的时间可能会更长一些.... 从这句看来业务设计上有很大的问题呀
|
19
startar 2018-04-24 02:26:01 +08:00 via Android
用任务队列做
|
20
HarveyDent 2018-04-24 12:58:20 +08:00
你想想怎么把 1000 次查询的 SQL 该写成几条吧。
|
21
swat199538 2018-04-24 13:25:14 +08:00
这个是干嘛的做系统维护工作的?维护工作写定时脚本在 CLI 里面执行呀。
|
22
vincenttone 2018-04-24 14:09:44 +08:00
八成是个统计逻辑,写个定时统计就可以了吧。队列或者 crontab 就可以了。
|
23
abccccabc 2018-04-24 18:14:36 +08:00
4 楼的方案行得通。
我之前的公司就这样做,主要是跑一些东西。 |
24
turan12 OP |
25
vincenttone 2018-04-25 10:45:25 +08:00 1
@turan12 即使是实时统计系统也可以做成异步处理,前提是你的数据变化是否频繁,不频繁可以展示的时候显示计算时间和数据变化时间,或者显示查询中之类,这都是产品问题了。
还有就是你的查询八成是可以做成并行的,第一次或者 n 次的总查询完成后,可以多个线程并行。用的是 php 的话,可以考虑用 ev 扩展或者 swoole 之类的起并行。 |
26
turan12 OP @vincenttone 数据变化的还是很频繁的,基本是秒级。不过并行却是个很好的思路,之前没想到。
|
27
vincenttone 2018-04-25 15:21:47 +08:00
@turan12 嗯 并行的时候注意数据库连接的占用,尽量复用应该问题不大
|
28
turan12 OP @vincenttone 嗯,多谢提醒!
|
29
han8gui 2018-06-08 13:45:28 +08:00
服用数据库实例的话,就没啥问题。
|
30
swat199538 2019-05-17 10:20:15 +08:00
@turan12 我也推荐异步处理方式。前端等待结果就行了。
|