我正在使用 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
限制很迷茫,有了解过这方面的人吗?
1
chentaoyu6 OP 我考虑是 dns 解析的问题,但是不知从何下手
|
2
a8829192 2018-12-03 17:45:11 +08:00
@chentaoyu6 如果你觉得是 dns 解析问题的话,要不尝试改一下本机与服务器的 hosts 表,把本机的 qq 的 ip 改成服务器的 qq 的 ip ?
|
3
chentaoyu6 OP 我试了一下,不行,把服务器上解析出来 qq 的 ip 拿到本地,还是一样的要 6 秒
|