现在业务是这样子的,
需要每 X 分钟执行这一段代码,
这段代码先从其他服务器上收集数据,然后用 php 整理这段数据,再传送到另外一台服务器。
但是这段的代码,第一层的 foreach 的元素也许是 20 个,所有的代码执行完成会超过 5 分钟。
要求是第一个元素要每隔 5 分钟发送给另外一台服务器,但是由于所有执行完超过 5 分钟,
会导致第一个元素也许要 5+x 分钟才能更新
Q1:请问这种如何解决?
Q2:如果说把这 20 个元素分别跑 20 个进程,可不可以?以后会有什么后果?对服务器的压力大不大?
Q3:如今代码是用 php 同步的方式请求的,领导说可以尝试 php 异步的方式,但是说实话, php 我写到现在都是同步的,也没听人提起过 php 用异步的,网上查了下说很少这么写,想问下你们怎么看?
Thanks
1
Hyeongo 2016-06-02 10:01:29 +08:00
生产者消费者模式
弄个队列,把数据插入这个队列 每 5 分钟把这个队列的数据发送过去 |
2
will0404 2016-06-02 10:05:29 +08:00
方法 1 : php 不了解,多进程是个方案,不用开 20 个,只要能减少到 5 分钟一下就满足要求了吧。
方法 2 :用队列处理,一次处理一个,处理一个发一个,一个要不了 5 分钟吧? 方法 3 :用 nodejs 写(异步咯) |
3
server 2016-06-02 10:06:55 +08:00
http://php.net/manual/zh/function.pcntl-fork.php . popen 多平台。
|
4
william23 OP |
5
cccoco123 2016-06-03 16:24:34 +08:00
https://github.com/fucongcong/Group 定时+任务队列 或者用 async swoole 的异步多进程来做
|
6
z5864703 2016-06-03 18:24:15 +08:00
@william23 收集数据、处理数据、发送数据分离
收集数据比如 5 分钟取一次?然后丢处理队列。 处理数据部分是持久化处理,一直保持运行检测处理队列,一有新数据就取出处理。处理完丢结果到发送队列 发送数据部分也是持久化处理,检测发送队列,然后按规则比如五分钟发一次推送数据。 处理数据部分先尽可能优化处理逻辑,然后可以开多线程并行加速处理,注意是多线程。目前 php 支持多线程,不过需要安装一个扩展 Pthread |
7
nightspirit 2016-06-11 00:05:09 +08:00
队列是个方案,就第一个元素必须 5 分内更新,应该可以实现。
|