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

2018-12-03 17:16:55 +08:00
 chentaoyu6

我正在使用 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

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

1684 次点击
所在节点    问与答
3 条回复
chentaoyu6
2018-12-03 17:20:08 +08:00
我考虑是 dns 解析的问题,但是不知从何下手
a8829192
2018-12-03 17:45:11 +08:00
@chentaoyu6 如果你觉得是 dns 解析问题的话,要不尝试改一下本机与服务器的 hosts 表,把本机的 qq 的 ip 改成服务器的 qq 的 ip ?
chentaoyu6
2018-12-03 17:59:23 +08:00
我试了一下,不行,把服务器上解析出来 qq 的 ip 拿到本地,还是一样的要 6 秒

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513897

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX