一些有志青年可能最近手刃了Workerman源碼,對于里面那一大坨stream_select()、stream_socket_server()表示疑惑,這個玩意和socket_create、socket_set_nonblock()有啥區(qū)別
<?php
// 創(chuàng)建一個監(jiān)聽socket,這個一個阻塞IO的socket
$listen = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_bind( $listen, '0.0.0.0', 9999 );
socket_listen( $listen );
while( true ){
// socket_accept也是阻塞的,雖然有while,但是由于accpet是阻塞的,所以這段代碼不會進(jìn)入無限死循環(huán)中
$connect = socket_accept( $listen );
if( $connect ){
echo "有新的客戶端".PHP_EOL;
} else {
echo "客戶端連接失敗".PHP_EOL;
}
}
<?php
// 創(chuàng)建一個監(jiān)聽socket,將其設(shè)置為非阻塞
$listen = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_bind( $listen, '0.0.0.0', 9999 );
socket_listen( $listen );
// ???????????? 這里設(shè)置非阻塞!
socket_set_nonblock( $listen );
while( true ){
$connect = socket_accept( $listen );
if( $connect ){
echo "有新的客戶端".PHP_EOL;
} else {
echo "客戶端連接失敗".PHP_EOL;
}
}
在監(jiān)聽socketIO的時候,設(shè)置為阻塞模式,只有當(dāng)新用戶連接時觸發(fā)繼續(xù),在無新用戶時,整個進(jìn)程阻塞。
當(dāng)設(shè)置為非阻塞模式中,會一直執(zhí)行while循環(huán),CPU100% ,無論有無新用戶。