在Walker類中有如下代碼:
// 嘗試打開tcp的keepalive,關(guān)閉TCP Nagle算法
if(function_exists('socket_import_stream'))
{
$socket = socket_import_stream($this->_mainSocket );
@socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
@socket_set_option($socket, SOL_SOCKET, TCP_NODELAY, 1);
}
為何需要在socket_import_stream存在的情況下,設(shè)置SO_KEEPALIVE和TCP_NODELAY,不存在就不需要調(diào)用么?
另外socket_import_stream
訪問和傳入的$this->_mainSocket
的值是一樣的,為何還需要再調(diào)用一次?
php提供兩種socket:
php提供了兩種類型的socket,http://php.net/manual/en/book.stream.php 和 http://php.net/manual/en/book.sockets.php,二者api不兼容。
stream_socket是php內(nèi)置的,可以直接使用,并且api和stream 的api通用(可以調(diào)用fread fwrite...)。
sockets需要php安裝sockets擴(kuò)展才能使用。
workerman使用stream_socket
為了不依賴擴(kuò)展加上能讓workerman的event-loop同時能操作普通stream資源,workerman使用了php內(nèi)置的stream_socket。
stream_socket缺點(diǎn)
stream_socket與sockets相比有個缺點(diǎn),無法精確設(shè)置socket選項(xiàng)。當(dāng)需要設(shè)置stream_socket選項(xiàng)時,
可以通過http://php.net/manual/en/function.socket-import-stream.php將stream_socket轉(zhuǎn)換成擴(kuò)展的sockets,然后就可以通過http://php.net/manual/en/function.socket-set-option.php設(shè)置stream_socket的socket選項(xiàng)了。
為何判斷socket_import_stream函數(shù)是否存在?
由于socket_import_stream屬于sockets擴(kuò)展提供的api,并且php>=5.4才支持,所以要判斷下function_exists('socket_import_stream')是否存在,不存在說明擴(kuò)展沒裝或者版本不支持,所以不能調(diào)用。
他是不是想問如果php5.3及以下版本或者沒有安裝sockets擴(kuò)展的話,就無法設(shè)置keep_alive,那么后續(xù)會代碼或者業(yè)務(wù)照成什么樣的影響嗎?
感謝boss,我也想了解下哈