
这个程序不会调用的太频繁,但就是需要花费几分钟时间(可能需要进行数千次 MySQL 查询)。而且随着数据量的增加需要花费的时间可能会更长一些。不知道像这种需要花费一定时间才能执行完毕的 PHP 页面会不会给服务器或程序带来各种问题?如果会的话顺便求个解决方案。
1 tegic 2018-04-23 14:52:14 +08:00 内存消耗过大,应用蹦了咋整? |
3 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 去实时读取进度 我这个方案是实战经过检验的 |
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 我觉得你首先应该想一下怎么优化代码,毕竟一直下去,天知道服务器和数据库抗不扛得住。 |
6 leven87 2018-04-23 15:22:37 +08:00 via Android 这种是定时任务吧 一般放在凌晨执行。数据量大的话,可以考虑把表和数据复制一份到线下。这样就对线上没有任何影响了 |
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 耗时较长的任务还是用异步队列吧,可以参考 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 我也担心这个问题。不过好在这个页面是在后台管理里调用的,而且权限设定的较高,一般一天只会调用 -2 次。 |
17 wenzhoou 2018-04-24 00:13:21 +08:00 via Android 严重怀疑处理逻辑有问题。江湖老中医也得找到病根了再下药不迟。 |
18 niubee1 2018-04-24 00:45:42 +08:00 随着数据量的增加,需要花费的时间可能会更长一些.... 从这句看来业务设计上有很大的问题呀 |
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 @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 我也推荐异步处理方式。前端等待结果就行了。 |