appnet - 高性能異步網絡事件庫

afiv1282 8年前發布 | 15K 次閱讀 C/C++開發

appnet是一個基于linux epoll的多線程的高性能異步網絡事件庫,目標是用高性能的PHP版本
搭載appnet取代C/lua或C/python模式,快速構建強有力的長連接服務器,以彌補PHP固有的缺陷。
使其可廣泛用于聊天系統,游戲服務器,消息通知服務器等實時通信場景。可對網絡IO密集性場景
或CPU密集性場景配置reactor數量和woker數量的比例,使硬件運行于最佳狀態。

其特點有
[1],高性能,純C語言開發,epoll異步非阻塞事件通知機制.
[2],易用性,使用方式簡單,并提供PHP7.0版本擴展。
[3],高并發,多線程網絡IO,Per Thread One Loop并發模型,多個worker進程并行處理業務。
[4],多協議,可混合TCP協議,websocket協議和簡單http協議與服務器通信。
[5],內存優化,進程間通信使用共享內存,兼容jemalloc和tcmalloc內存優化技術。
[6],緩沖區優化,自適應緩沖區,根據數據包大小自動增長縮小,避免內存浪費和緩沖區溢出
與其它網絡庫粗略比較
[1], 相比node.js單進程模式,appnet可充分利用多核CPU,不致于服務器資源浪費。
[2], 相比nginx多進程+fpm多進程,支持TCP協議,websocket協議等長連接。
[3], 相比libevent,原生支持多線程無需再次封裝,支持混合協議。
[4], 相比memcache多線程+libevent模型,appnet支持多任務處理業務,具有更少的封裝。
[5], 相比redis單進程網絡模型,具體有更強的網絡IO能力,appnet也就是redis網絡層的增強版本

以上是一個美好的愿望,目前websocket協議和http協議尚未實現,還存已知的在進程終止時有可能會
內存泄露BUG,目前是一個人開發,也缺少更多的測試,希望有興趣的同學一起參與進來測試,開發和提建議。
讓PHP真正成為世界上最好的語言,沒有之一。。

安裝方法:
1,源碼安裝php_7.0.x
2,下載擴展到任意目錄appnet_php7
3,執行如下指令:
 >cd appnet_php7
 >/usr/local/php7/bin/phpize
 >./configure --with-php-config=/usr/local/php7/bin/php-config
 >make
 >make install
 >php test/test.php
 >telnet 127.0.0.1 3011
 開始測試吧。

<?php
dl( "appnet.so");
$server = new appnetServer( "0.0.0.0" , 3011 );
$server->on('connect', function( $serv , $fd )
{
        $pid = posix_getpid();
        echo "Client:Connect:{$fd} pid={$pid} \n";
});

$server->on('receive', function( $serv , $fd , $buffer )
{
        echo "Client Recv:[{$buffer}][{$fd}] \n";
        $header = $serv->getHeader();
        if( $header['Protocol'] == "WEBSOCKET" )
        {
           Websocket::onReceive( $serv , $fd,  $buffer );
        }
});

$server->on( 'close' , function( $serv , $fd )
{
        echo "Client Close:$fd \n";
});

//on worker run start,you can init env.
$server->on( 'start' , function( $serv  )
{
        $pid = posix_getpid();
        echo "On Worker Start!! pid={$pid} \n";

        //3000ms means 3second  
        $serv->timerAdd( 3000 , "onTimerCallback" , "paramsxxx" );
});

//on worker shutdown,you must save data in last time.
$server->on( 'final' , function( $serv  )
{
        $pid = posix_getpid();
        echo "On Worker Final!! pid={$pid} \n";
});

function onTimerCallback( $serv , $timer_id ,  $params )
{
        $pid = posix_getpid();
        echo "onTimerCallback  ok,worker pid={$pid},timer_id={$timer_id}...\n";

        //if do not remove it, it will be call this function forever    
        $serv->timerRemove( $timer_id );
}
$server->run();

?>


官方網站:http://www.baiduhome.net/lib/view/home/1455511580292


 本文由用戶 afiv1282 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!