源碼:
$this->_socket = stream_socket_client("{$this->transport}://{$this->_remoteAddress}", $errno, $errstr, 0,
STREAM_CLIENT_ASYNC_CONNECT);
。
。
。
Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'checkConnection'));
請(qǐng)問,我故意把remoteAddress寫成一個(gè)無效的地址,如3.3.3.3:3333,EV_WRITE的監(jiān)聽還是在4秒左右觸發(fā)了checkConnection,這是為什么呢???
<?php
global $eb,$client,$time;
$time=time();
$eb=new EventBase();
$timer=new Event($eb,-1,Event::TIMEOUT,function()use(&$timer){
$timer->add(1);
});
$client=stream_socket_client("tcp://3.3.3.3:2222",$errcode,$errstr,0,STREAM_CLIENT_ASYNC_CONNECT);
$et=new Event($eb,$client,Event::WRITE,function($client){
global $time;
echo time()-$time;
});
$et->add();
$timer->add(1);
$eb->loop();
我寫的一個(gè)測(cè)試用例,發(fā)現(xiàn)不是4秒,是7秒觸發(fā)的
具體細(xì)節(jié)不知道,但是大概原因知道了,因?yàn)?proc/sys/net/ipv4/tcp_syn_retries的含義是重發(fā)SYN包的次數(shù),而我的虛擬機(jī)這個(gè)值是2,第一次3秒,第二次4秒,這兩次發(fā)完后,認(rèn)為這個(gè)連接已經(jīng)失敗了,發(fā)了一個(gè)信號(hào)(FIN?)給event,所以觸發(fā)了checkConnection。細(xì)節(jié)我再想辦法了解下。