V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
chentaoyu6
V2EX  ›  问与答

求救,为什么 imap 连接这么慢

  •  1
     
  •   chentaoyu6 · 2018-12-03 17:16:55 +08:00 · 1719 次点击
    这是一个创建于 2187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我正在使用 php 进行 webmail 开发,但是一直有一个问题,使用 imap_open 连接的时候,发现在 windows 上了连接 qq 很慢,单纯一个 imap_open 连接就要 5-6 秒,这里是代码

    $a = time();
    $user = "my username";
    $password = "my password";
    $mbox = @imap_open('{imap.qq.com:143/imap}INBOX',$user,$password);
    var_dump(time()-$a);
    var_dump(is_resource($mbox));
    
    

    运行结果为

    int(5)
    bool(true)
    

    但是连接 163 的时候速度很快,没有延迟; 接着我切换成 linux 系统,同样的代码,qq 没有延迟,163 延迟 20s,于是我在 linux 上用 telnet 做了个测试

    结果

    秒获取数据,那应该不是网络问题,当我使用 strace 追踪连接的时候,发现在两个地方延迟很大

    14:36:05 socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 4
    14:36:05 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("183.60.83.19")}, 16) = 0
    14:36:05 gettimeofday({1543818965, 536641}, NULL) = 0
    14:36:05 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}])
    14:36:05 sendto(4, "\207\213\1\0\0\1\0\0\0\0\0\0\00247\00250\003125\003123\7in-addr\4arpa\0\0\f\0\1", 44, MSG_NOSIGNAL, NULL, 0) = 44
    14:36:05 poll([{fd=4, events=POLLIN}], 1, 5000
    
    
    
    ) = 0 (Timeout)
    14:36:10 socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 5
    14:36:10 connect(5, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("183.60.82.98")}, 16) = 0
    14:36:10 gettimeofday({1543818970, 541177}, NULL) = 0
    14:36:10 poll([{fd=5, events=POLLOUT}], 1, 0) = 1 ([{fd=5, revents=POLLOUT}])
    14:36:10 sendto(5, "\207\213\1\0\0\1\0\0\0\0\0\0\00247\00250\003125\003123\7in-addr\4arpa\0\0\f\0\1", 44, MSG_NOSIGNAL, NULL, 0) = 44
    14:36:10 poll([{fd=5, events=POLLIN}], 1, 5000
    
    
    
    
    ) = 0 (Timeout)
    14:36:15 gettimeofday({1543818975, 546459}, NULL) = 0
    14:36:15 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}])
    14:36:15 sendto(4, "\207\213\1\0\0\1\0\0\0\0\0\0\00247\00250\003125\003123\7in-addr\4arpa\0\0\f\0\1", 44, MSG_NOSIGNAL, NULL, 0) = 44
    14:36:15 poll([{fd=4, events=POLLIN}], 1, 5000) = 1 ([{fd=4, revents=POLLIN}])
    14:36:15 ioctl(4, FIONREAD, [44])       = 0
    14:36:15 recvfrom(4, "\207\213\201\202\0\1\0\0\0\0\0\0\00247\00250\003125\003123\7in-addr\4arpa\0\0\f\0\1", 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("183.60.83.19")}, [16]) = 44
    14:36:15 close(4)                       = 0
    14:36:15 close(5)                       = 0
    14:36:15 socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 4
    14:36:15 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("183.60.82.98")}, 16) = 0
    14:36:15 gettimeofday({1543818975, 546840}, NULL) = 0
    14:36:15 poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}])
    14:36:15 sendto(4, "\207\213\1\0\0\1\0\0\0\0\0\0\00247\00250\003125\003123\7in-addr\4arpa\0\0\f\0\1", 44, MSG_NOSIGNAL, NULL, 0) = 44
    14:36:15 poll([{fd=4, events=POLLIN}], 1, 5000
    
    

    限制很迷茫,有了解过这方面的人吗?

    3 条回复    2018-12-03 17:59:23 +08:00
    chentaoyu6
        1
    chentaoyu6  
    OP
       2018-12-03 17:20:08 +08:00
    我考虑是 dns 解析的问题,但是不知从何下手
    a8829192
        2
    a8829192  
       2018-12-03 17:45:11 +08:00
    @chentaoyu6 如果你觉得是 dns 解析问题的话,要不尝试改一下本机与服务器的 hosts 表,把本机的 qq 的 ip 改成服务器的 qq 的 ip ?
    chentaoyu6
        3
    chentaoyu6  
    OP
       2018-12-03 17:59:23 +08:00
    我试了一下,不行,把服务器上解析出来 qq 的 ip 拿到本地,还是一样的要 6 秒
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1655 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:57 · PVG 00:57 · LAX 08:57 · JFK 11:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.