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

请教这个问题的解决方案( web 方向)

  •  
  •   william23 · 2016-06-02 09:40:01 +08:00 · 2005 次点击
    这是一个创建于 2877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在业务是这样子的,

    需要每 X 分钟执行这一段代码,

    这段代码先从其他服务器上收集数据,然后用 php 整理这段数据,再传送到另外一台服务器。

    但是这段的代码,第一层的 foreach 的元素也许是 20 个,所有的代码执行完成会超过 5 分钟。

    要求是第一个元素要每隔 5 分钟发送给另外一台服务器,但是由于所有执行完超过 5 分钟,

    会导致第一个元素也许要 5+x 分钟才能更新

    Q1:请问这种如何解决?

    Q2:如果说把这 20 个元素分别跑 20 个进程,可不可以?以后会有什么后果?对服务器的压力大不大?

    Q3:如今代码是用 php 同步的方式请求的,领导说可以尝试 php 异步的方式,但是说实话, php 我写到现在都是同步的,也没听人提起过 php 用异步的,网上查了下说很少这么写,想问下你们怎么看?

    Thanks

    7 条回复    2016-06-11 00:05:09 +08:00
    Hyeongo
        1
    Hyeongo  
       2016-06-02 10:01:29 +08:00
    生产者消费者模式
    弄个队列,把数据插入这个队列
    每 5 分钟把这个队列的数据发送过去
    will0404
        2
    will0404  
       2016-06-02 10:05:29 +08:00
    方法 1 : php 不了解,多进程是个方案,不用开 20 个,只要能减少到 5 分钟一下就满足要求了吧。
    方法 2 :用队列处理,一次处理一个,处理一个发一个,一个要不了 5 分钟吧?
    方法 3 :用 nodejs 写(异步咯)
    server
        3
    server  
       2016-06-02 10:06:55 +08:00
    william23
        4
    william23  
    OP
       2016-06-03 09:14:20 +08:00
    @Hyeongo @will0404 问题是他需要等访问 url 后才能获取数据,然后再发送,这样子即使后面发送是每 5 分钟一次,但是还要加上读取数据的时间,即是从 url 后访问的数据。
    cccoco123
        5
    cccoco123  
       2016-06-03 16:24:34 +08:00
    https://github.com/fucongcong/Group 定时+任务队列 或者用 async swoole 的异步多进程来做
    z5864703
        6
    z5864703  
       2016-06-03 18:24:15 +08:00
    @william23 收集数据、处理数据、发送数据分离
    收集数据比如 5 分钟取一次?然后丢处理队列。
    处理数据部分是持久化处理,一直保持运行检测处理队列,一有新数据就取出处理。处理完丢结果到发送队列
    发送数据部分也是持久化处理,检测发送队列,然后按规则比如五分钟发一次推送数据。
    处理数据部分先尽可能优化处理逻辑,然后可以开多线程并行加速处理,注意是多线程。目前 php 支持多线程,不过需要安装一个扩展 Pthread
    nightspirit
        7
    nightspirit  
       2016-06-11 00:05:09 +08:00
    队列是个方案,就第一个元素必须 5 分内更新,应该可以实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5334 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:30 · PVG 09:30 · LAX 18:30 · JFK 21:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.