kk941kk
V2EX  ›  PHP

PHP 处理大量数据的效率问题。

  •  
  •   kk941kk · May 3, 2017 · 5447 views
    This topic created in 3307 days ago, the information mentioned may be changed or developed.

    有一张 30W 用户的数据表,里面有用户的手机号码,我需要通过一个 API 查询到手机号的归属地和运营商信息,然后修改到数据库。 目前我做的是循环查询修改,这样效率很低,每秒平均 6 条左右,求推荐效率高的办法,谢谢~~

    18 replies    2017-05-10 20:24:08 +08:00
    huijiewei
        1
    huijiewei  
       May 3, 2017
    这个和 PHP 没关系,明显是网络请求占用时间,API 支持批量查询吗,支持就分批搞
    kslr
        2
    kslr  
       May 3, 2017
    你的 api 支持更快地查询吗? 可以从并行/异步下手。
    kk941kk
        3
    kk941kk  
    OP
       May 3, 2017
    @huijiewei 不支持啊,只能一条条查出来
    kk941kk
        4
    kk941kk  
    OP
       May 3, 2017
    @kslr api 不支持,也改不了,只能自己想办法了,您说的我再查一查
    gouchaoer
        5
    gouchaoer  
       May 3, 2017   ❤️ 1
    php 有最好的 httpclient 是 Guzzle,你可以批量发请求去访问 api,注意使用 php-cli。。。我查询几十个 ip 的归属地,ipip.net 不支持批量查询,用 Guzzle 的话几 s 内返回吧
    kslr
        6
    kslr  
       May 3, 2017
    @kk941kk #4 看下这个项目有没有帮助

    https://github.com/shitoudev/phone-location
    用这份 17 年数据验证下 https://github.com/xluohome/phonedata
    kk941kk
        7
    kk941kk  
    OP
       May 3, 2017
    @gouchaoer 谢谢,我去试试~
    Immortal
        8
    Immortal  
       May 3, 2017
    对的 如果 api 不支持批量就自己建立并发去查询
    jugelizi
        9
    jugelizi  
       May 3, 2017
    可以一次性查几十条出来然后在也页面用 js 批量去查询并更新
    一批查完就执行下一批
    we3613040
        10
    we3613040  
       May 3, 2017
    多任務,多進程或多線程
    php300
        11
    php300  
       May 3, 2017
    .......
    byfar
        12
    byfar  
       May 3, 2017   ❤️ 1
    1.25 小时过去了,应该跑了 3w 条了吧,14 个小时之前答题都还有点用

    写一个 php 脚本 每次查一条未更新过的更新,直到没有数据退出

    运行多个这个脚本,ok
    lslqtz
        13
    lslqtz  
       May 3, 2017
    并发。
    asen477
        14
    asen477  
       May 3, 2017
    写个存储过程,直接调用存储过程。
    wombat
        15
    wombat  
       May 3, 2017
    表里数据应该有 id 吧,利用 id%某值,写多个脚本,同时执行
    sagaxu
        16
    sagaxu  
       May 3, 2017
    @gouchaoer 高级爬虫工程师靠谱
    kk941kk
        17
    kk941kk  
    OP
       May 4, 2017
    昨天中途去忙别的了,现在用的是 @kslr 的方法,谢谢大家的帮助~~
    lygmqkl
        18
    lygmqkl  
       May 10, 2017
    用 cli 命令行跑,或者换 其它语言跑,以数据库为分界点。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2204 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 00:37 · PVG 08:37 · LAX 17:37 · JFK 20:37
    ♥ Do have faith in what you're doing.