我有基于ZendFramework的应用程序,它正在使用与其他ZendFramework应用程序的XMLRPC通信。两者都在同一台服务器上(用于开发)。沟通非常缓慢,我试图找出原因。在分析之后,我到了ZF Lib XMLRPC阅读器的fgets()内部速度减慢的地步。
在基于ZendFramework的PHP应用程序中,我得到了一些带有recv()的模式 等了15秒?任何人都知道为什么会发生这种情况?
0.000038 gettimeofday({1278333900, 86101}, NULL) = 0
0.000037 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 32
0.000035 fcntl64(32, F_GETFL) = 0x2 (flags O_RDWR)
0.000033 fcntl64(32, F_SETFL, O_RDWR|O_NONBLOCK) = 0
0.000034 connect(32, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
0.000076 poll([{fd=32, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLOUT}])
0.000045 getsockopt(32, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
0.000036 fcntl64(32, F_SETFL, O_RDWR) = 0
0.000113 send(32, "POST /r/?articleId=554&hpr=Pimpl"..., 1180, MSG_DONTWAIT) = 1180
0.000148 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
0.028020 recv(32, "HTTP/1.1 200 OK\r\nDate: Mon, 05 J"..., 8192, MSG_DONTWAIT) = 543
0.000105 poll([{fd=32, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
0.000050 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
15.012976 recv(32, "", 8192, MSG_DONTWAIT) = 0
0.000123 close(32) = 0
答案 0 :(得分:1)
我对ZendFramework知之甚少,所以我的评论很简单......但是!
如果我理解正确
0.000050 poll([{fd=32, events=POLLIN|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=32, revents=POLLIN}])
15.012976 recv(32, "", 8192, MSG_DONTWAIT) = 0
这意味着你在套接字(32)上轮询你得到一个信号POLLIN(传入数据)你去recv并等待15秒(超时)得到0字节
这对我来说就是一个错误。可能在zendframework或者你如何称呼它。在recv之后接收0个字节表示套接字已完全关闭(与强制关闭相反)。因此,当您退出轮询并进入recv时,响应应该是立即的(它只读取0字节)
MSG_DONTWAIT标志我假设意味着进入非阻塞模式,这意味着无论数据是否等待它都应该立即返回,无论是数据还是使用willblock错误,都会返回到轮询循环。
可能是其他东西冻结线程导致锁定。尝试将应用程序放在两台不同的计算机上,以查看是否出现相同的错误。这可能是一些奇怪的互动。
DC